Overlay.draw () вызывает много раз

У меня есть вопрос относительноdraw() методOverlay класс в Android Maps.

Когда я перемещаю карту, методdraw() позвоните несколько раз (с 4 до 13). Это проблема для меня, потому что этот метод должен перекрасить мой маршрут с 70000+ точками, а это много ресурсов.

Я не могу найти описание для этой проблемы, но когда я использую примеры кода из любых источников, у меня та же проблема.

 Kristopher Johnson13 авг. 2013 г., 21:48
 shkschneider17 окт. 2012 г., 12:04
Можете ли вы предоставить код?
 Luis14 нояб. 2012 г., 12:18
Для ясности лучше перенестиnew problem ниже к новому вопросу. И вы получите больше ответа тоже :-)
 Konstantin.Efimenko17 окт. 2012 г., 12:26
Я думаю, что это не зависит от кода. Вы можете получить любой исходный пример с Android Maps, поместить точку останова в метод draw () и увидеть это явление. Я могу отправить весь свой исходный код (с макетами, манифестом). Я не знаю, как прикрепить его к ветке.

Ответы на вопрос(2)

Решение Вопроса

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

Для удобстваdraw() метод наложения вызывается для каждого из этих небольших шагов, так что вы можете изменить положение элементов наложения, чтобы выполнить все эти шаги.

Вы можете улучшить его, используя следующее:

Улучшение 1

Для каждого из маленьких шагов,onDraw называется дважды. Один сshadow параметр равенtrueи один равенfalse, Если вы не рисуете тени, вы можете просто проигнорировать один из вызовов и, следовательно, уменьшить накладные расходы на 2, используя следующую строку в качестве первой строкиonDraw():

if(shadow) return;

Улучшение 2

Оптимизируйте способ прохождения маршрута. Если вы используетеcanvas.drawLine() Вы можете определенно улучшить его, используяcanvas.drawPath(), Вы создаете путь с вашим маршрутом только один раз (для определенного уровня масштабирования), а когда карта перемещается, вы просто смещаете путь без необходимости его повторного создания.

Улучшение 3

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

Я использую описанный выше подход с маршрутами в несколько тысяч точек (приблизительно 20 000), и маршрут движется плавно в устройстве средней дальности.

Дайте мне знать, если вам нужно больше деталей в любом из вышеперечисленных пунктов.

удачи.

 Franva25 мая 2014 г., 07:28
Привет @Luis, я также использую OverylayView, но я не могу найти метод onDraw (), даже в его справочнике API (developers.google.com/maps/documentation/javascript/...). Не могли бы вы привести пример, если это возможно? Спасибо
 Konstantin.Efimenko17 окт. 2012 г., 17:33
Благодарю вас! Я попробую это.

что вы используете

boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)

и нет

void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow)

Первый используется для рисования анимации, поэтому он вызывается много раз.

Ref:ничья постоянно вызывается в моем наложении карты Android

Ваш ответ на вопрос