2012-11-22 6 views
1

Я работаю над простым приложением Android для прокладки маршрутов на карте. Все идет хорошо, но у меня проблема при масштабировании на моем Samsung Galaxy S2. Он отлично работает на Galaxy S3, поэтому мне интересно, связано ли это с управлением памятью на устройстве с низким разрешением. Он также отлично работает на эмуляторе.Наложение MapView MapView исчезает при масштабировании

Вот эквивалентный код, расположенный в накладках OnDraw метода, просто конденсируется для размещения здесь:

Point current = new Point(); 
Path path = new Path(); 
Projection projection = mapView.getProjection(); 

Iterator<GeoPoint> iterator = pointList.iterator(); 
if (iterator.hasNext()) { 
    projection.toPixels(iterator.next(), current); 
    path.moveTo((float) current.x, (float) current.y); 
} else return path; 
while(iterator.hasNext()) { 
    projection.toPixels(iterator.next(), current); 
    path.lineTo((float) current.x, (float) current.y); 
} 

Paint roadPaint = new Paint(); 
roadPaint.setAntiAlias(true); 
roadPaint.setStrokeWidth(8.0f); 
roadPaint.setColor(Color.BLACK); 
roadPaint.setStyle(Paint.Style.STROKE); 

canvas.drawPath(path, roadPaint); 

Это не слишком отличается от большинства примеров коды с плавающей вокруг для этого. Мне просто интересно, может ли кто-нибудь подтвердить мои подозрения и сообщить, есть ли что-нибудь, что я могу сделать с точки зрения конфигурации или настроек, которые я могу сделать, чтобы заставить рисовать на всех уровнях масштабирования?

Заранее спасибо.

Приветствия, Натан

ответ

0

Вы сказали, что приведенные выше код был эквивалентен (не настоящий код, который вы используете), и это понятно, потому что вы возвращаете объект Path в onDraw(), которого вы не могли.

«Сжатая форма» кода, который вы показываете, должна работать, а также использовать drawLine(). Поэтому проблема должна исходить из чего-то другого (может быть, исходного кода).

Во всяком случае, я дам вам несколько подсказок:

  • Когда верхние и нижние части объекта вы рисуете на холст оба из экрана, объект игнорируются и не обращается. Убедитесь, что это не то, что происходит с вашим путем. См. Мой ответ в этом сообщении. Android Map Overlay Disappears on Zoom
  • Вам не нужно каждый раз перестраивать объект пути. Вероятно, вы уже это делаете, поэтому вы сделали короткую версию выше. Смотрите мой ответ на этот пост с некоторыми предложениями по улучшению пути рисования: Overlay behavior when zooming
  • Если по какой-то причине вы действительно хотите использовать более медленный подход drawLine(), вы можете использовать follwing, чтобы сделать линию выглядеть лучше:

    paint = new Paint(); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeJoin(Paint.Join.ROUND); 
    paint.setStrokeCap(Paint.Cap.ROUND); 
    paint.setColor(...); 
    paint.setAlpha(...); 
    paint.setStrokeWidth(...); 
    

И, наконец, если проблема остается, обновите свой вопрос с помощью более релевантного кода и дайте мне знать. Может быть, я могу помочь дальше.

С уважением.

+0

Да, функция разделена на кучу методов, которые инкапсулируют каждый шаг. Замечательно читать в среде IDE, но слишком много для публикации. У меня есть версия, которая кэширует путь и переводит его, но я удалил его, пока не выясню, почему он исчезает. Я подозреваю, что это связано с верхней и нижней частью пути, как вы обнаружили с вашими прямоугольниками. setStrokeJoin и setStrokeCap ​​могут быть хорошей резервностью. Забавно, что вы упоминаете, что это медленнее, это быстрее, чем моя реализация текущего пути, просто уродливее. Cheers, Nathan – thenathanjones

+0

Вы попали в гвоздь на голове. Когда верхний и нижний пределы пути выходят из экрана, путь не нарисован. Это не происходит с решением линий, поскольку оно всегда находится на экране. Теперь решите, что с ним делать. – thenathanjones

+0

Все еще не объясняет, почему это происходит только на моем устройстве, а не на эмуляторе или Galaxy S3. – thenathanjones

1

Проблема заключается в том, что вы красите НАКЛАДКИ себя очень специфичного состояния MapView. Вместо этого вы должны использовать OverlayItem.

OverlayItem добавляется в коллекцию MapView накладок и MapView обрабатывает все перерисовывая в зависимости от его собственного состояния (увеличения, местоположения и т.д.)

@Override 
public void draw(Canvas canvas, MapView mapView, boolean shadow) 
{ 
    super.draw(canvas, mapView, shadow); 

    int x1 = -1; 
    int y1 = -1; 
    int x2 = -1; 
    int y2 = -1; 

    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setColor(GeoLocation.ROUTE_COLOR); 
    paint.setStrokeWidth(STROKE_WIDTH); 

    for (int i = 0; i < mRouteGeoPoints.size(); i++) 
    { 
     Point point = new Point(); 
     mapView.getProjection().toPixels(geoPoints.get(i), point); 
     x2 = point.x; 
     y2 = point.y; 
     if (i > 0) 
     { 
      canvas.drawLine(x1, y1, x2, y2, paint); 
     } 
     x1 = x2; 
     y1 = y2; 
    } 
} 
+0

Is OverlayItem не используется для особых предметов, расположенных в точке? Вся документация, которую я читал, говорит о том, что путь должен быть нарисован классом, расширяющим Overlay. – thenathanjones

+0

Правильно. Таким образом, ваш код действительно выполняется в onDraw подкласса Overlay? –

+0

Это правильно. Как я уже сказал, функционально работает нормально, эмулятор и GS3 работают нормально.У меня есть другие приложения на том же телефоне, у которых нет этой проблемы, поэтому мне просто интересно, есть ли какая-то магия, которую я пропускаю :) – thenathanjones

Смежные вопросы