【问题标题】:Attempting to calculate width of Map Overlays on the fly尝试即时计算地图叠加层的宽度
【发布时间】:2010-03-12 22:33:35
【问题描述】:

我正在开发一个使用 Google Maps API MapView、MapController、MapActivity 和 ItemizedOverlay 的 Android 应用程序。我基本上是在尝试重新创建 Maps 应用程序的某些功能(该死的 Google 没有为项目提供气泡——因为没有更好的名称!),尤其是那些气泡。

在包含我的 MapView 的 XML 布局文件中,我的语音气泡有一个不可见的 XML 结构。第一次显示语音气泡时,我抓取该 XML 并将其从其当前父级中删除,对其应用一些 ItemizedOverlay.LayoutParams,并将其作为叠加层添加到 MapView。我将它放在所选项目的上方,用正确的文本填充它,然后将其设置为可见。

这一切都很好。不过,这里的目标是自动为地图设置动画,以显示语音气泡的任何部分,这些部分在打开时可能不在屏幕上。因此,在对气泡进行所有操作之后,即使在将其显示给用户之后,我仍在尝试 popup.getWidth() (弹出窗口是我的 LinearLayout 的实例,它是语音气泡)。问题是,popup.getWidth() 正在返回我之前显示的弹出窗口的宽度,而不是当前显示的。我无法弄清楚为什么会发生这种情况,如果我要获取宽度 after 我将其设置为具有新尺寸的可见性(顺便说一下,当我设置它们时,它们是相对的使用 LayoutParams: fill_content for both width and height).. 我什至尝试在尝试获取宽度之前强制 MapView 和“弹出窗口”都无效()。

任何想法为什么会发生这种情况?在尝试获取视图之前,如何强制视图适应新维度?

谢谢! 尼克

【问题讨论】:

  • 你能帮我添加气泡部分吗?我想知道怎么做,但我做不到。

标签: android google-maps map overlay


【解决方案1】:

addView()invalidate() 之类的调用不会立即发生。您可以将其想象为这些调用创建了消息队列中的消息。当您从您所在的任何回调(例如,onTap())返回时,主应用程序线程将恢复其正常角色,即从该队列中弹出消息并处理它们。因此,您所做的更改不会立即生效,而只会在您返回后生效。

您可以尝试做的是将需要宽度的逻辑放入Runnablepost()-ing Runnable。这将把它放在队列中,大概在你的addView() 和相关的东西之后。此时,当Runnable 运行时,您应该能够获得正确的宽度。

【讨论】:

  • 非常感谢您提供有关消息队列的信息。这真的有助于我理解这里发生了什么。我会试试你的 Runnable 想法,看看效果如何。会回帖。
  • 像魅力一样工作!非常感谢。
  • @Bloudermilk 知道弹出窗口的宽度,您如何知道隐藏了多少以及如何移动地图以使整个弹出窗口可见?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2013-06-09
  • 1970-01-01
相关资源
最近更新 更多