Android谷歌地图v2相机动画

时间:2013-02-11 16:32:44

标签: android animation camera google-maps-api-2

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

无论如何,这里是Google Maps 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方法!

我可以在做任何相机动画之前去做检查,但我不喜欢这样做是浪费。

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

4 个答案:

答案 0 :(得分: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);

            }
        });
    }

}

希望这可以帮助你;)

答案 1 :(得分: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
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

这是另一个解决方法:

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