Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 根据LatLngBounds,GoogleMap moveCamera或animateCamera不准确_Android_Google Maps_Google Maps Android Api 2 - Fatal编程技术网

Android 根据LatLngBounds,GoogleMap moveCamera或animateCamera不准确

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

我对使用CameraUpdateFactory.newLatLngBounds()的moveCamera和animateCamera的准确性有一些疑问。我将创建的LatLngBounds对象作为参数发送到moveCamera/animateCamera(CameraUpdateFactory.newLatLngBounds())、map.getProjection().getVisibleRegion().onCameraChange()事件中的LatLngBounds甚至GoogleMap.CancelableCallback#onFinish()它们不匹配。 有人遇到过这个问题吗?这是虫子吗

我的代码是:

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上。