2010-03-12 25 views
0

我正在使用Google Maps API MapView,MapController,MapActivity和ItemizedOverlay的Android應用程序。我基本上試圖重新創建地圖應用程序的某些功能(該死的谷歌不提供語音氣泡 - 因爲缺少更好的名稱),尤其是那些語音氣泡。試圖計算地圖疊加層的寬度

我在包含我的MapView的XML佈局文件中有一個語音氣泡的不可見XML結構。當我第一次展示語音氣泡時,我抓住該XML並將其從當前父節點中移除,然後將一些ItemizedOverlay.LayoutParams應用於該節點,然後將其作爲疊加層添加到MapView中。我將它放在選定的項目上方,用適當的文本填充它,然後將其設置爲可見。

這一切都很好。不過,這裏的目標也是自動地圖動畫,以揭示講話泡泡的任何部分,當它打開時它可能在屏幕外。所以我試圖完成對氣泡的所有操作之後,即使在將其顯示給用戶之後,popup.getWidth()(popup是我的LinearLayout的實例,它是氣泡)。問題是,popup.getWidth()返回先前顯示的彈出窗口的寬度,而不是當前顯示的窗口的寬度。我無法弄清楚爲什麼會發生這種情況,如果我在之後獲取寬度我將其設置爲可見並具有其新維度(順便說一句,當我使用LayoutParams設置它們時,它們是相對的:fill_content for寬度和高度)..我甚至嘗試強制MapView和「彈出」無效()之前試圖獲取寬度。

任何想法,爲什麼會發生這種情況?在試圖獲取它們之前,我如何強制視圖進入新的層面?

謝謝! 尼克

+0

你可以幫我添加泡沫部分嗎?我試圖找出如何去做,但我無法做到。 – 2010-08-23 09:53:07

回答

1

電話像addView()invalidate()不會立即發生。你可以把它看作是這些調用創建消息隊列中的消息。當您從任何回調中返回(例如,onTap())時,主應用程序線程將返回到正常角色,即從該隊列中彈出消息並對其進行處理。因此,您所做的更改不會立即生效,而只會在您返回之後立即生效。

你可以嘗試做的是把你的邏輯需要的寬度在Runnablepost()-那Runnable。這將把它放在隊列中,大概在你的addView()和相關的東西之後。在那時,當Runnable運行時,您應該能夠獲得正確的寬度。

+0

非常感謝消息隊列中的信息。這真的幫助我理解這裏發生了什麼。我會嘗試你的Runnable的想法,看看如何。將回傳。 – bloudermilk 2010-03-13 00:13:01

+0

工程就像一個魅力!非常感謝。 – bloudermilk 2010-03-13 01:19:53

+0

@Bloudermilk瞭解彈出窗口的寬度,你怎麼知道它有多少隱藏,以及如何移動地圖使整個彈出窗口可見? – 2010-07-16 21:54:37