Попытка вычислить ширину наложения карты на лету - PullRequest
0 голосов
/ 13 марта 2010

Я работаю над приложением Android, которое использует API Карт Google MapView, MapController, MapActivity и ItemizedOverlay. В основном я пытаюсь воссоздать определенные функции приложения «Карты» (черт побери, Google не предоставляет речевые пузыри - из-за отсутствия лучшего названия - для предметов!), Особенно эти речевые пузыри.

У меня есть невидимая структура XML для речевого пузыря в файле макета XML, содержащем мой MapView. В первый раз, когда я показываю речевой пузырь, я беру этот XML и удаляю его из его текущего родителя, применяя к нему некоторые ItemizedOverlay.LayoutParams, и добавляю его в MapView как наложение. Я помещаю его над выбранным элементом, заполняю его соответствующим текстом, затем устанавливаю его видимым.

Все это прекрасно работает. Цель здесь, однако, также состоит в том, чтобы автоматически анимировать карту, чтобы показать любые части речевого пузыря, которые могут быть вне экрана, когда он открывается. Итак, я пытаюсь popup.getWidth () (popup - это экземпляр моего LinearLayout, который является речевым пузырем) после того, как я выполню все манипуляции с пузырем, даже после того, как я отобразлю его пользователю. Проблема в том, что popup.getWidth () возвращает мне ширину ранее отображаемого всплывающего окна, а не отображаемое в данный момент. Я не могу понять, почему это произойдет, если я получаю ширину после Я устанавливаю ее видимой с ее новыми размерами (которые, кстати, являются относительными, когда я устанавливаю их с LayoutParams: fill_content как для ширины, так и для высоты). Я даже пытался принудить и MapView, и «всплывающее окно» сделать недействительным (), прежде чем пытаться извлечь ширину.

Есть идеи, почему это может происходить? Как я могу заставить Вид переместиться в его новые измерения, прежде чем пытаться получить их?

Спасибо! Ник

1 Ответ

1 голос
/ 13 марта 2010

Звонки типа addView() и invalidate() происходят не сразу. Вы можете думать об этом, как будто эти вызовы создают сообщения, которые попадают в очередь сообщений. Когда вы возвращаетесь из любого обратного вызова (например, onTap()), основной поток приложения возвращается к своей обычной роли - извлечение сообщений из этой очереди и их обработка. Следовательно, изменения, которые вы вносите, не вступят в силу немедленно, а только после вашего возвращения.

То, что вы можете попытаться сделать, это поместить вашу логику, для которой нужна ширина, в Runnable и post(), то есть Runnable. Это поместит его в очередь, по-видимому, после вашего addView() и связанных с ним вещей. В этот момент, когда этот Runnable будет запущен, вы сможете получить правильную ширину.

...