Ничья постоянно вызывается в моем наложении на карту андроида
Я пытаюсь нарисовать маршрут на моем MapView.
Я расширил Overlay и реализовал метод draw().
Маршрут отображается правильно, хотя во время отладки,
Я добавил точку останова на draw() и заметил, что она вызывается постоянно.
Я хочу, чтобы он был повторно нарисован, если кто-то перемещает карту или масштабирование (при рисовании учитываются эти изменения)
Что может вызвать это?
Ответы
Ответ 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 );}
Это приведет к удалению тени из наложения карты.