2013-02-11 68 views
8

所以即時通訊不知道這是一個錯誤還是不...還可能是我可能錯過了一些東西。安卓谷歌地圖v2相機動畫

無論如何,這裏是谷歌地圖V2相機控制的鏈接。 https://developers.google.com/maps/documentation/android/views#moving_the_camera

問題:

動畫的位置已經到動畫不調用onFinish();

如何複製:

mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(mLocation.getLatLng(), zoomLevel), 200, new GoogleMap.CancelableCallback() { 

        @Override 
        public void onFinish() { 
         //DO some stuff here! 
        Log.d("animation", "onFinishCalled"); 

        } 

        @Override 
        public void onCancel() { 
        Log.d("animation", "onCancel"); 


        } 
       }); 

這個問題可能都約當用戶雙擊水龍頭一些東西,叫做即使之間,onFinish將只能被稱爲一個成功的動畫很長一段時間相同的動畫。當相機已經定位時,onFinish方法將不會被調用!

我可以在做任何相機動畫之前進行檢查,但我不喜歡那種浪費。

任何幫助,將不勝感激。 謝謝。

+0

到目前爲止唯一可行的替代方法是使用moveCamera而不是animateCamera,但是BOOOO。 – 2013-02-11 16:49:57

回答

15

我有同樣的問題,當我想移動相機到相同的位置,它似乎像一個錯誤。 即使新舊位置不一樣,差別也很小,例如:old position.latitude = 94.54284009112,new position.latitude = 94.54284003451,它不起作用。 我的解決方案是截斷值只獲得old_position.latitude = new_position.latitude = 94.54,然後我做了一個測試。

移動相機並同時滾動地圖還有另一個問題,因爲我在移動之前禁用滾動手勢,並在onFinish()和onCancel()上啓用它。

public void animateCameraTo(final double lat, final double lng) 
{ 
    _googleMap = getMap(); 
    CameraPosition camPosition = _googleMap.getCameraPosition(); 
    if (!((Math.floor(camPosition.target.latitude * 100)/100) == (Math.floor(lat * 100)/100) && (Math.floor(camPosition.target.longitude * 100)/100) == (Math.floor(lng * 100)/100))) 
    { 
     _googleMap.getUiSettings().setScrollGesturesEnabled(false); 
     _googleMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(lat, lng)), new CancelableCallback() 
     { 

      @Override 
      public void onFinish() 
      { 
       _googleMap.getUiSettings().setScrollGesturesEnabled(true); 

      } 

      @Override 
      public void onCancel() 
      { 
       _googleMap.getUiSettings().setAllGesturesEnabled(true); 

      } 
     }); 
    } 

} 

希望這有助於你;)

+2

公平點,周圍的好工作,我會下降到至少4小數點雖然!緯度長的2個小數仍然是一個相當大的區域 – 2013-04-05 14:40:58

+1

緯度/長度的舍入舍入到最接近的100表面上看起來是任意的,並導致不同的行爲取決於縮放級別更好的解決方案將包含縮放級別以確定要舍入的數量。 – Graham 2014-06-06 13:42:52

0

我發現的唯一解決方案是進行無用的像素值檢查,建立一個僞造的CameraUpdate對象,並使用僞造的CameraUpdate先調用嵌套的animateCamera()調用,然後調用另一個cameraUpdate()首先使用正確的CameraUpdate onFinish()。我今天安裝了Google MAP v2更新,但沒有幫助。這對我來說是一個設備旋轉的問題。我正在顯示邊界矩形,並且質心在旋轉時不會改變,所以animateCamera()不起作用,並且在旋轉設備時,所選矩形可能會部分偏離屏幕。

您是否找到另一個解決方案了? 謝謝

+0

沒有,iv移動移動相機,而不是animateCamera哪些有點吸吮:( – 2013-03-07 11:54:41

+0

我可以想到的唯一選擇(類似於你的)是檢查是否您開始動畫之前,您的動畫的LatLng是相同的目標相機位置。如果是你的onFinished方法,那麼當你旋轉時你的rects可能是空的。看看這個http://developer.android.com/guide/topics/resources/runtime-changes.html可能有助於 – 2013-03-07 11:59:02

-1

這裏的另一種解決辦法:

你確實知道你的地圖動畫的動畫時長。所以,你可以發佈延遲可運行與動畫時間+偏移一些的延遲和那裏你可以檢查成品/ canceld監聽器被稱爲......如果不是你可以在那裏把它拿來和調用apropriate聽衆

2

你應該檢查像素距離,而不是地理距離:

LatLngBounds myBounds = YOUR_BOUNDS; 
LatLngBounds visibleBounds = map.getProjection().getVisibleRegion().latLngBounds; 
Point myCenter = map.getProjection().toScreenLocation(myBounds.getCenter()); 
Point visibleCenter = map.getProjection().toScreenLocation(visibleBounds.getCenter()); 
int dist = (int) Math.sqrt(Math.pow(myCenter.x - visibleCenter.x, 2) + Math.pow(myCenter.y - visibleCenter.y, 2)); 
if (dist > YOUR_THRESHOLD) { 
    map.animateCamera(CameraUpdateFactory.newLatLngBounds(myBounds, YOUR_PADDING), new GoogleMap.CancelableCallback() { 
     @Override 
     public void onFinish() { 
      // do something 
     } 

     @Override 
     public void onCancel() { 
      // do something 
     } 
    }); 
} else { 
    // do something 
}