Подтвердить что ты не робот

Ничья постоянно вызывается в моем наложении на карту андроида

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

Я хочу, чтобы он был повторно нарисован, если кто-то перемещает карту или масштабирование (при рисовании учитываются эти изменения) Что может вызвать это?

4b9b3361

Ответ 1

Есть два метода рисования, которые можно переопределить.

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

Desc: нарисуйте наложение над картой.

boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)
Desc: Нарисуйте вызов для анимированных наложений.

Я первоначально переопределял второй.
После перехода к первому методу все получилось.

Ответ 2

Я думаю, что метод draw вызывается повторно, потому что фон постоянно перерисовывается. попробуйте установить "MapView.ReticleDrawMode" в DRAW_RETICLE_UNDER. Это в основном подсказывает mapView нарисовать сетку под наложениями. Таким образом, метод наложения наложения не будет вызываться при возврате фона. это исправило проблему для меня.

для получения дополнительной информации, смотрите здесь: MapView Api

Ответ 3

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

Ответ 4

После дальнейшего обзора наложение() Overlay draw() действительно работает, как описано в документации. Одна нить для shadow = true, а другая для shadow = false.

Интересно, что конкретный метод наложения draw() реагирует как рекламируемый для каждого элемента, нарисованного в MapView. Например, в моем случае, похоже, для каждой карты Google, на которой размещена карта Google, отображается логотип Google, а затем конкретный оверлей, который я нарисовал. Очевидно, дважды для каждого (тень true | false).

Это, вероятно, предназначенный способ отображения карт. Я не нашел или потратил достаточно времени для изучения этой информации.

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

Ответ 5

Для меня это выглядит как странная ошибка - иногда метод draw называется постоянно, иногда нет.

см. здесь.

Ответ 6

В моем приложении у меня есть неопределенный индикатор выполнения (например, вращающийся круг), когда я загружаю сетевые данные для карты. Когда сетевые данные закончены, я установил видимость индикатора выполнения невидимым. Однако это привело к тому, что карта постоянно перерисовывалась, поскольку кажется, что любая анимация (я предполагаю), которая имеет место на карте, приведет к перерисовке карты. Простое решение этого - установить видимость вместо этого. Например. измените это:

ProgressBar loadingIcon = (ProgressBar) findViewById(R.id.loadingIcon);
...
//Network data now finished loading...
loadingIcon.setVisibility(View.INVISIBLE);

:

loadingIcon.setVisibility(View.GONE);

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

Ответ 7

Я знаю, что это старая проблема, но я только что столкнулся с ней. Это "за что стоит".

Рисовый цикл оказался ошибкой кодирования с моей стороны. Согласно документу, если процедура draw возвращает true, она запрашивает немедленное обновление. Если false возвращается, для каждого наложения производится только два прохода; один для теневой истины и один для тени false. Я возвращался назад, что привело к постоянному обновлению. После того, как я изменил значение на false, произошло только два прохода на один оверлей. Нет цикла.

Ответ 8

Вы можете просто добавить это в класс ItemizedOverlay:

@Override public void draw( Canvas c, MapView m, boolean shadow ) { super.draw( c, m, false );}

Это приведет к удалению тени из наложения карты.