2012-09-23 72 views
0

我有一個MapView,其上有各種標記。第一次進入MapActivity時,我在標記上設置了可繪製的邊界,並且一切都很好。標記和陰影全部顯示正確。但是當我點擊另一個活動並返回時,陰影或標記不再正確綁定。有時只有一些標記受到影響。誰能告訴我這裏發生了什麼?這是一些代碼。下面是我設置上的標記繪製邊界:Android MapView標記陰影在活動恢復後移動

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()事件之後重繪。有任何想法嗎?

更新:我實際上已經想通了,只有類型的圖像挖掘移動,它不是影子,而是移動的圖像。因此,有A型的X圖像和B型的Y圖像,並且我點擊任何類型A的圖像,當我返回到MapActivity時,類型A的所有圖像都與它們的陰影對齊,而所有類型的圖像B仍然正確對齊。

另一個更新:我輸出界限到日誌,並看到界限在返回到地圖屏幕後發生變化。當最初加入的標記物,其邊界是:

[矩形(-25,-48 - 25,1)]

但返回到地圖屏幕時,界限已經改變到:

[Rect(0,0 - 50,49)]

...爲什麼會這樣呢?

又一次更新:我有一個解決方法...但我仍然想回答爲什麼發生這種情況。解決方法是重寫draw方法,並在調用draw方法時設置邊界(到底部)。這裏是代碼:

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

我相信這個問題不在上面的代碼中,如果沒有更多的信息或更多的代碼,將很難幫助你。如果問題僅出現在您觸摸某個項目後纔出現,則可能是您的onTap方法存在問題。您是否在觸摸時更改繪圖(即從正常狀態變爲選定狀態或變焦狀態)? – Luis

+0

除了打開一項新活動外,我在onTap方法上做得並不多。我在onTap()中註釋了代碼(以及它的各個部分),除非新的活動已啓動,否則不會看到錯誤。我已經追蹤了邊界的變化,它是在離開新開始的活動並返回到地圖屏幕之後。我猜想當返回到地圖屏幕時會發生重繪,並且onTabsChange()會在tapped drawable(s)上被調用。 – broadbear

+0

你檢查過你的簡歷方法嗎?從活動返回後,您不需要讀取標記(它們應該保留在內存中)。你在那裏做任何事情可能會混亂嗎?爲了您的信息,我已經完成了幾個從mapview調用活動的應用程序,但都沒有顯示這個問題。 – Luis

回答

0

我發現問題是什麼。您可以從問題中的代碼中看到,我正在從InputStream中讀取BitmapDrawables。爲了減少浪費,我把所有在flyweight中創建的圖像放在一起,並在我可以的時候重新使用它們。這意味着,當我在地圖上放置3個「sunshines」時,所有三個都基於相同的圖像。另外,當我通過ItemizedOverlay將它們放置在地圖上時,我正在調用boundCenterBottom(),以便陰影顯示在正確的位置。

當我打開一個不同的活動時,該活動有一個ImageView,我正在填充相同的圖像。原來,ImageView必須重置邊界。我知道這是因爲在重寫draw()方法並設置每個繪圖的邊界之後,我不再能夠在ImageView中看到圖像。當我註釋掉重寫的draw()方法時,我能夠在ImageView中看到圖像,但是當我返回到地圖時圖像會移動。這告訴我,將圖像添加到ImageView必須更新邊界。

我的解決方案是爲每個圖像類型創建兩個不同的圖像;一個用於地圖,另一個用於其他活動的ImageView。我仍然可以將它們放在flyweight中,但它們具有單獨的鍵,因此可以爲同一圖像存在多個圖像實例。

希望這可以幫助別人。我知道還有另一個關於StackOverflow的問題,但是我找不到它來鏈接或回答。