安卓谷歌地图v2相机动画

8

我不确定这是否是一个错误,可能是我错过了什么。

无论如何,这里是 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方法!
我可以在执行任何相机动画之前进行检查,但我不喜欢这样做,因为这是浪费资源的。
非常感谢您的帮助。

到目前为止,唯一可行的替代方法是使用moveCamera而不是animateCamera,但是这种方法太糟糕了。 - Aiden Fry
4个回答

17

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

            }
        });
    }

}

希望这能对你有所帮助;)


2
公正的观点,很好的解决方法,我会降到至少4个小数点!经纬度上的2个小数位仍然是相当大的区域。 - Aiden Fry
1
将纬度/经度值四舍五入到最接近的百分之一似乎是任意的,并且会根据缩放级别产生不同的行为。更好的解决方案应该包括缩放级别来确定四舍五入的量。 - Graham

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
}

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

你找到其他解决方案了吗? 谢谢


不,我已经改用moveCamera而不是animateCamera了,这有点糟糕:( - Aiden Fry
我能想到的唯一替代方案(类似于你的)是在开始动画之前检查您要动画到的LatLng是否与相机目标位置相同。如果是,请执行您的onFinished方法。当您旋转时,您的矩形可能会变为空值。请参考http://developer.android.com/guide/topics/resources/runtime-changes.html,这可能会有所帮助。 - Aiden Fry

-1

这里有另一个解决方法:

你知道地图动画的持续时间。因此,你可以发布一个延迟的可运行对象,延迟为动画持续时间加上一些偏移量,然后在那里检查是否调用了完成/取消监听器...如果没有,你可以在那里获取它并调用相应的监听器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接