【问题标题】:Android Google Maps v2 Camera AnimationAndroid 谷歌地图 v2 相机动画
【发布时间】:2013-02-11 16:32:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 到目前为止,唯一可行的替代方法是使用 moveCamera 而不是 animateCamera 但 BOOOO 。

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


【解决方案1】:

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

            }
        });
    }

}

希望对你有所帮助;)

【讨论】:

  • 公平点,很好的解决方法,不过我会至少保留 4 个小数点!经纬度上的 2 位小数仍然是一个很大的区域
  • 将 lat/long 值四舍五入到最接近的第 100 位似乎是任意的,并且会根据缩放级别导致不同的行为。更好的解决方案是结合缩放级别来确定四舍五入的数量。
【解决方案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
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不,iv 移动到 moveCamera 而不是 animateCamera,这有点糟糕:(
    • 我能想到的唯一选择(类似于你的)是在开始动画之前检查你正在制作动画的 LatLng 是否与相机目标位置相同。如果是你的 onFinished 方法。当您旋转时,您的矩形可能会被取消。看看这个developer.android.com/guide/topics/resources/… 可能会有所帮助
    【解决方案4】:

    这是另一种解决方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多