2010-09-25 51 views
10

我正在研究一個應用程序,該應用程序顯示在Google MapView上移動項目的位置。我需要一種方法來更新表示項目的圖標的位置(以及隨着更新的數據進入,每兩秒更改一次圖標的朝向)。在Android MapView上移動圖標

我目前在擴展MapActivity的應用程序中有一個活動。在這之前,我覆蓋了一個在地圖上繪製一些線條的靜態覆蓋圖和一個繪製靜態圖標的ItemizedOverlay。

有一個draw()方法聲稱被動畫疊加使用,但是覆蓋它來完成我的動畫仍然不會生成任何動畫。

我是否需要告訴應用使我的覆蓋層變成動畫,還是我需要使用不同類型的覆蓋層?

回答

4

對於您的問題,我有兩件事情需要考慮。

首先,您是否考慮在MapView上使用invalidate()來強制重繪?這是 可能不是最有效的解決方案,但它至少應該爲您提供一些您可以使用的解決方案。

其次,您可以通過再次調用活動來刷新地圖上的項目。這是一個example

+0

我已經考慮過無效選項。從我讀過的內容來看,這可能會影響表現,但我會試試看。我想知道的是:爲了平滑地將圖標從一個地方移動到另一個地方,我該如何使覆蓋無效〜每秒20次? – Hober 2010-10-04 15:04:02

+1

也許你應該考慮使用一個計時器線程,看看這個http://www.anddev.org/viewtopic.php?t=126 – 2010-10-04 17:28:29

+0

我結束了使用一個普通的查看和postTime從TimerThread驗證它給我的更新。碰巧,我不希望地圖重新繪製每一幀,只是這個其他視圖上的移動對象,所以我正在尋找使用繪圖緩存來保存MapView。也就是說,你對計時器線程的回答是非常正確的。它可以讓您每秒刷新固定次數,因此您可以保證良好的幀率而不顯示每個可能的幀。 – Hober 2010-10-29 23:59:12

0

我對這個Android的東西還是很新的,但是我前幾天讀的是Android Unleashed 2nd ed(manning early access program),它包含了動畫......這聽起來就像是一個東西。

Animation anim = new TranslateAnimation(startX, stopX, startY, stopY); 
anim.setDuration(2000 /* 2 seconds */); 
anim.init(overlayWid, overlayHei, parentWid, parentHei) 

myItemizedOverlay.startAnimation(anim); 

請注意,我還沒有嘗試過任何類型的東西,但這就是本書/ JavaDoc讓我相信會起作用。您可能需要在startAnimation()之前調用。就像我說的......幾乎不是我的專業領域(還!)。

我不認爲你需要用這種方法搞砸無效。

+0

我相信你不能在ItemizedOverlays上使用動畫。 – Tom 2011-11-21 17:02:03

1

使用MapView和Overlays的內置功能來繪製動畫可能會殺死你的性能。我的建議是:

1)結合MapView與另一個視圖。 MapView將爲您提供必要的屏幕座標,另一個視圖將用作動畫的畫布。兩個視圖都應該佔據相同的屏幕位置(使用框架佈局);

2)一旦你得到了地圖標記的位置,你想要動畫 - 從地圖中刪除它,並開始使用第二個視圖動畫標記的運動。在這裏,你可以利用專門的機器人動畫類(即動畫,AnimationUtil,AnimationSet)

3)一旦你用動畫做 - 添加標記MapView的疊加,現在在新的位置和無效覆蓋

也許有可以是更優化的方法(即直接在MapView畫布上使用動畫),但底線 - 您應該使用專門的動畫機制來防止性能問題。

0

作爲顯示動畫的選項,您可以使用MapView類的addView方法。 這是簡單的:

  1. 只是創建一個視圖(如ImageView或任何其他視圖);
  2. 初始化視圖佈局,創建並傳遞MapView.LayoutParams到setLayoutParams方法;
  3. 將視圖添加到MapView。

當您滾動地圖時,視圖會自動移動。

public static void addAnimationToMap(MapView map, int animationResourceId, GeoPoint geoPoint) { 

    final ImageView view = new ImageView(map.getContext()); 
    view.setImageResource(animationResourceId); 

    //Post to start animation because it doesn't start if start() method is called in activity OnCreate method. 
    view.post(new Runnable() { 
     @Override 
     public void run() { 
      AnimationDrawable animationDrawable = (AnimationDrawable) view.getDrawable(); 
      animationDrawable.start(); 
     } 
    }); 

    map.addView(view); 

    MapView.LayoutParams layoutParams = new MapView.LayoutParams(
      MapView.LayoutParams.WRAP_CONTENT, 
      MapView.LayoutParams.WRAP_CONTENT, 
      geoPoint, 
      MapView.LayoutParams.BOTTOM_CENTER); 
    view.setLayoutParams(layoutParams); 
}