所以我不确定这是否是一个错误......可能是或者我可能错过了什么。
无论如何,这里是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方法!
我可以在做任何相机动画之前去做检查,但我不喜欢这样做是浪费。
任何帮助将不胜感激。 感谢。
答案 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监听器......如果没有,你可以在那里获取并调用适当的监听器