Тени маркеров Android MapView перемещаются после возобновления активности

У меня есть MapView с различными маркерами. При первом входе в MapActivity я устанавливаю границы рисунков, установленных на маркерах, и все выглядит нормально. Маркеры и тени отображаются правильно. Но когда я перехожу к другому действию и возвращаюсь, тени или маркеры больше не привязаны правильно. Иногда затрагиваются только некоторые из маркеров. Кто-нибудь может сказать мне, что здесь происходит? Вот некоторый код. Ниже я устанавливаю границы маркера, который можно рисовать:

InputStream is = assetManager.open(imageName);
drawable = Drawable.createFromStream(is, null);
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
drawable.setBounds(-width / 2, -height, width - (width / 2), 0);

И вот как я создаю/добавляю элемент наложения на карту:

GeoPoint point = createGeoPoint(lat, lon);
OverlayItem overlayItem = new OverlayItem(point, character.get_id(), "");
Drawable image = drawable;
overlayItem.setMarker(image);
itemizedOverlay.addOverlay(overlayItem);

Насколько я могу судить, оверлеи не добавляются на карту повторно, это просто перерисовка после события onResume(). Любые идеи?

Обновление: я на самом деле понял, что движутся только изображения того типа, которые нажаты, и это не тень, а изображение, которое движется. Итак, если есть x изображений типа A и y изображений типа B, и я нажимаю на любое изображение типа A, все изображения типа A смещаются по своим теням, когда я возвращаюсь к MapActivity, в то время как все изображения типа B по-прежнему правильно выровнены.

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

[Прямо(-25, -48 - 25, 1)]

Но при возврате на экран карты границы изменились на:

[Прямо(0, 0 - 50, 49)]

... с чего бы это?

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

@Override
public void draw(Canvas canvas) {
  int dWidth = getIntrinsicWidth();
  int dHeight = getIntrinsicHeight();
  setBounds(-dWidth / 2, -dHeight, dWidth / 2, 0);
  super.draw(canvas);
}

person broadbear    schedule 23.09.2012    source источник
comment
Я считаю, что проблема не в приведенном выше коде, и вам будет трудно помочь без дополнительной информации или дополнительного кода. Вероятно, проблема связана с вашим методом onTap, если проблема появляется только после того, как вы коснулись элемента. Меняете ли вы рисуемое при прикосновении (то есть из нормального в выбранное или сфокусированное состояние)?   -  person Luis    schedule 24.09.2012
comment
Я мало что делаю в методе onTap, кроме открытия новой активности. Я прокомментировал код (и различные его части по отдельности) в onTap() и не вижу ошибки, если не запущено новое действие. Я проследил, когда границы меняются, и это происходит после выхода из недавно начатой ​​активности и возврата к экрану карты. Я предполагаю, что при возврате на экран карты происходит перерисовка, а onBoundsChange() вызывается для нажатых рисунков.   -  person broadbear    schedule 24.09.2012
comment
Вы проверили метод onResume. После возвращения из активности считывать маркеры не нужно (они должны оставаться в памяти). Вы делаете что-нибудь там, что может нарушить границы? К вашему сведению, я сделал несколько приложений, которые вызывают действия из представления карты, и ни одно из них не показывает эту проблему.   -  person Luis    schedule 25.09.2012
comment
Я думал об этом, но я не переопределяю метод onResume. На самом деле это дубликат другого сообщения (которое я сейчас не могу найти). На самом деле он опубликовал скриншоты, демонстрирующие точное поведение, которое я вижу. Там тоже не было решения. Я ничего не делаю явно по возвращении. Повторного добавления маркеров нет. Что-то меняет границы внутри, перед перерисовкой карты, и я не могу понять что.   -  person broadbear    schedule 29.09.2012
comment
Еще один совет ... вы не показываете, как вы определяете переменную, которую можно рисовать, но если она статическая, вы можете изменить ее где-то еще, даже в другом действии.   -  person Luis    schedule 30.09.2012


Ответы (1)


Я узнал, в чем проблема. Из кода в вопросе видно, что я читаю BitmapDrawables из InputStream. Чтобы уменьшить отходы, я помещаю все созданные изображения в легковес и повторно использую их, когда могу. Это означает, что когда я помещаю на карту 3 «солнца», все они основаны на одном и том же изображении. Кроме того, когда я размещаю их на карте с помощью ItemizedOverlay, я вызываюboundCenterBottom(), чтобы тень отображалась в правильном месте.

Когда я открываю другое действие, в этом действии есть ImageView, который я заполнял тем же изображением. Оказывается, ImageView, должно быть, сбрасывал границы. Я знаю это, потому что после переопределения метода draw() и установки границ для каждого рисования я больше не мог видеть изображения в ImageViews. Когда я комментирую переопределенный метод draw(), я могу видеть изображения в ImageViews, но изображения смещаются, когда я возвращаюсь к карте. Это говорит мне, что добавление изображения в ImageView должно обновлять границы.

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

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

person broadbear    schedule 08.10.2012