Android 根据LatLngBounds,GoogleMap moveCamera或animateCamera不准确
我对使用CameraUpdateFactory.newLatLngBounds()的moveCamera和animateCamera的准确性有一些疑问。我将创建的LatLngBounds对象作为参数发送到moveCamera/animateCamera(CameraUpdateFactory.newLatLngBounds())、map.getProjection().getVisibleRegion().onCameraChange()事件中的LatLngBounds甚至GoogleMap.CancelableCallback#onFinish()它们不匹配。 有人遇到过这个问题吗?这是虫子吗 我的代码是:Android 根据LatLngBounds,GoogleMap moveCamera或animateCamera不准确,android,google-maps,google-maps-android-api-2,Android,Google Maps,Google Maps Android Api 2,我对使用CameraUpdateFactory.newLatLngBounds()的moveCamera和animateCamera的准确性有一些疑问。我将创建的LatLngBounds对象作为参数发送到moveCamera/animateCamera(CameraUpdateFactory.newLatLngBounds())、map.getProjection().getVisibleRegion().onCameraChange()事件中的LatLngBounds甚至GoogleMap.C
final LatLngBounds boundingBox = MapUtils.getBoundingBox(mCurrLocation.getLatitude(), mCurrLocation.getLongitude(), mCurrRadius);
try {
if (animate) {
map.animateCamera(CameraUpdateFactory.newLatLngBounds(boundingBox, 0),
new GoogleMap.CancelableCallback() {
@Override
public void onFinish() {
if (!boundingBox.equals(map.getProjection().getVisibleRegion().latLngBounds)) {
map.moveCamera(CameraUpdateFactory.newLatLngBounds(boundingBox, 0));
}
}
@Override
public void onCancel() {
}
});
} else {
map.moveCamera(CameraUpdateFactory.newLatLngBounds(boundingBox, 0));
}
}
请忽略我比较这两个对象的方式(等于)。我还调试了代码,检查了这两个对象,发现它们不匹配-
移动摄像机:
边界框-
LatLngBounds{西南部=纬度/液化天然气:(32.08455383290544,34.773394063736845),东北部=纬度/液化天然气:(32.09730731777191,34.788375176773286)}
map.getProjection().getVisibleRegion().latLngBounds-
LatLngBounds{西南部=纬度/液化天然气:(32.08449629947356,34.77339383214712),东北部=纬度/液化天然气:(32.09736452396455,34.78837497532368)}
animateCamera:
边界框-
LatLngBounds{西南部=纬度/液化天然气:(40.70798493778415,-74.01434069136418),东北部=纬度/液化天然气:(40.72072004852845,-73.99760391411343)}
map.getProjection().getVisibleRegion().latLngBounds-
LatLngBounds{西南部=纬度/液化天然气:(40.70798500292429,-74.01539381593466),东北部=纬度/液化天然气:(40.72071968970514,-73.99655096232891)}
这似乎是
bug&&两者的结合!错误
有关错误描述,请参见以下内容:
基本上,在小数点后第5位或第6位会有差异
另一个问题是,当您将
LatLngBounds
发送到其中一个函数时,生成的LatLngBounds
将是新的,完全适合屏幕,并且您的原始文件将在其中。animateCamera和LatLngBounds存在错误。该方法无法将相机准确地移动到预期的框中。我怎么知道?我通过添加以下代码验证了这一点:
private LatLngBounds mBoundingBox;
private boolean mCameraAnimated;
public void setCurrentLocation(Location currentLocation, String radius, boolean animate) {
mCurrLocation = currentLocation;
mCurrRadius = MapUtils.getRadiusDecimalValue(radius);
mBoundingBox = MapUtils.getBoundingBox(mCurrLocation.getLatitude(), mCurrLocation.getLongitude(), mCurrRadius);
mCameraAnimated = animate;
if (animate) {
mEventMap.animateCamera(CameraUpdateFactory.newLatLngBounds(mBoundingBox, 0));
} else {
mEventMap.moveCamera(CameraUpdateFactory.newLatLngBounds(mBoundingBox, 0));
}
}
@Override
public void onCameraChange(CameraPosition cameraPosition) {
// This ugly solution was added because there is a bug with camera animate which doesn't move to the correct bounding box.
if (mBoundingBox != null && !mBoundingBox.equals(mEventMap.getProjection().getVisibleRegion().latLngBounds)) {
LatLngBounds originalBoundingBox = mBoundingBox;
mBoundingBox = null;
if (mCameraAnimated) {
mCameraAnimated = false;
mEventMap.moveCamera(CameraUpdateFactory.newLatLngBounds(originalBoundingBox, 0));
return;
}
} ...
现在,在额外移动摄像机后,摄像机自身的位置正确。新的问题是,有时onCameraChange不会被这个额外的moveCamera触发,因此我不会执行我的实际onCameraChange代码(用“…”标记)。谢谢。我猜我正在计算边界框,假设地图是正方形的。事实并非如此。我之前的回答是错的。我正在正确计算边界框。查看我的补充答案。什么是
MapUtils
,你从哪里得到的?@IgorGanapolsky是我自己的utils类。与问题无关。我知道这是一个旧线程,但我有同样的问题,仍然没有解决这个错误的方法。我已经在十几部不同的手机上测试过,这只发生在三星GT-I9500上。