8

所以我不确定这是否是一个错误......可能是或者我可能错过了一些东西。

无论如何,这里是 Google Maps V2 Camera Controls 的链接。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 方法!

我可以在做任何相机动画之前四处检查,但我不喜欢这样做,因为它很浪费。

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

4

4 回答 4

15

当我想将相机移动到相同的位置时,我遇到了同样的问题,这似乎是一个错误。即使新旧位置不一样,差异很小,例如:旧位置.latitude = 94.54284009112,新位置.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);

            }
        });
    }

}

希望这可以帮助你;)

于 2013-04-04T15:22:24.740 回答
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
}
于 2014-06-07T11:28:55.593 回答
0

我发现的唯一解决方案是进行浪费的像素值检查,设置一个虚假(但关闭)CameraUpdate 对象并首先使用虚假 CameraUpdate 进行嵌套 animateCamera() 调用,然后在第一个 onFinish() 中调用另一个 cameraUpdate()使用正确的 CameraUpdate。我今天安装了 Google MAP v2 更新,但没有帮助。这对我来说是设备旋转的问题。我正在显示边界矩形,并且质心在旋转时不会改变,因此 animateCamera() 不起作用,并且当设备旋转时,选定的矩形可能部分离开屏幕。

你找到另一个解决方案了吗?谢谢

于 2013-03-07T07:45:14.110 回答
-1

这是另一种解决方法:

您确实知道地图动画的动画持续时间。所以你可以发布一个延迟的可运行的动画持续时间+一些偏移量,你可以在那里检查是否调用了完成/取消的监听器......如果没有,你可以在那里获取它并调用适当的监听器

于 2013-07-26T09:04:11.093 回答