2

我遇到了一些與Android MapView API有關的問題。我從我希望在MapView中顯示的數據庫中獲取OverlayItems。如果我顯示100個圖標,我沒有問題,但是如果它變得更多 - 就像一個城市中的500個項目 - 它首先看起來非常糟糕,而其次是它減慢了很多。不幸的是我的目標是顯示10000個。我認爲一個解決方案可以是向ZoomLevels註冊一個偵聽器,以使它們出現/消失,但我找不到該功能。其次,我找不到用縮放地圖縮放覆蓋圖的功能。 任何想法都非常歡迎如何在Android MapView中顯示數千個OverlayItems

+0

檢查了這一點http://stackoverflow.com/questions/7447350/android-maps-point-clustering – weakwire 2011-09-16 16:16:31

回答

4

在ItemizedOverlay繪製方法中存在一個非常奇怪的行爲。當你說:畫線從(x,y)到(x1,y1)時,繪製方法被調用大約20-30-40次 - 我不知道爲什麼。當你繪製一條線時,可以接受,但是當你繪製成千上萬條線條,圖標等時,這是非常糟糕的!要解決這個問題,你應該創建一個緩存覆蓋。這是疊加,捕捉第一次繪製,創建對象,然後防止未來繪製相同的繪製。

集羣是一個圖標後面的十幾個圖標。例如,如果地圖上有1000個標記,則在特定的最小縮放級別下,不能分別看到每個標記 - 它會變成一團亂七八糟的圖標和顏色等等。而不是一個接一個非常非常接近的100個標記,而是放置一個簇標記。在放大時,移除這個簇並創建另一個簇...執行此操作,直到標記變得足夠遠,並且您可以看到它們被分開。

檢查:Cluster markers

+0

謝謝你的解釋,我現在有一個想法,我必須做的。 你是否願意在每個不同的drawable上添加一個帶有defaultMarker的ItemizedOverlay,或者如果我將CachedDrawable設置爲OverlayItem的ImageResource,我就好了? – 2011-06-16 14:33:32

+0

我沒有得到這個。你能再解釋一下嗎,對不起。例如: – 2011-06-16 14:46:59

+0

:如果我創建一個新的ItemizedOverlay,我通常會在其構造函數中傳遞一個defaultMarker,該構造函數用於每個OverlayItem。 如果我有10個OverlayItems,我可以將它們添加到ItemizedOverlay。他們都會將defaultMarker設置爲Drawable。如果我想在一個特殊的OverlayItem中使用一個不同的Icon,我可以在OverlayItem的實例上調用setMarker(Drawable d)。 所以我只有一個ItemizedOverlay,但每個OverlayItem都有自己的標記,它指向一個cachedDrawable – 2011-06-16 14:57:07

2

採取以下方法:

  1. 創建一個緩存的疊加,以防止同一集羣的多個描繪;
  2. 在線程中繪製;
  3. 根據縮放級別和標記接近程度對您的標記進行聚類。
  4. 每次在覆蓋圖中繪製時,檢查確定是屏幕可見部分內的當前標記。如果不是,不要畫!
+1

嗯,THX對於這個問題的答案第一。但我真的不明白你的答案。什麼是緩存覆蓋和集羣,以及如何做到這一點? – 2011-06-16 09:44:58

0

我的應用程序中的圖標大小和縮放級別有類似的問題。我最終做的是有兩套包含標記的疊加層,一個帶有「放大」圖標和一個帶有「縮小」圖標。然後在某個縮放級別改變疊加層(使用縮放滾輪 - On zoom event for google maps on android