Android谷歌地图v2相机animation

所以即时通讯不知道这是一个错误还是没有…可能是或者我可能错过了一些东西。

无论如何,这里是谷歌地图V2相机控制的链接。 https://developers.google.com/maps/documentation/android/views#moving_the_camera

问题 :

animation到已经animation的位置,不会调用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"); } }); 

这个问题很可能出现,当用户双击某个叫做相同animation的东西时,即使这个animation之间有很长的时间,onFinish也只会被称为成功的animation。 当相机已经定位时,onFinish方法将不会被调用!

我可以在做任何照相机animation之前进行检查,但是我不喜欢那样做是浪费的。

任何帮助,将不胜感激。 谢谢。

Solutions Collecting From Web of "Android谷歌地图v2相机animation"

我有相同的问题,当我想移动相机到相同的位置,这似乎是一个错误。 即使新旧位置不一样,差别也很小,例如:旧的位置,水平位置= 94.54284009112,新的位置,水平位置= 94.54284003451,它不工作。 我的解决办法是截断值只获得old_position.latitude = new_position.latitude = 94.54,然后我做一个testing。

移动摄像机还有另一个问题,同时滚动地图,因为我在移动之前禁用滚动手势,并在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); } }); } } 

希望这可以帮助你;)

你应该检查像素距离,而不是地理距离:

 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 } 

我发现唯一的解决scheme是做无用的像素值检查,build立一个伪造的(但接近)的CameraUpdate对象,并使用伪造的CameraUpdate先调用另一个cameraUpdate()在第一个onFinish()内嵌套animateCamera()使用正确的CameraUpdate。 我今天安装了Google MAP v2更新,但没有帮助。 这对我来说是一个设备旋转的问题。 我正在显示边界矩形和质心不会改变旋转,所以animateCamera()不起作用,当设备旋转时,选定的矩形可能会部分离开屏幕。

你有没有find另一个解决scheme? 谢谢

这是另一个解决方法:

你知道你的地图animation的animation持续时间。 所以你可以发布一个延迟的运行时间延迟的animation持续时间+一些偏移量,在那里你可以检查完成/ canceld的监听器是否被调用…如果不是你可以在那里获取它并调用适当的监听器