2

我想为 MapView 相机设置动画,但想保留已设置的方位和倾斜使用。

我尝试了以下代码:

float bearing = map.getCameraPosition().bearing;
float tilt = map.getCameraPosition().tilt;

map.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder()
        .target(new LatLng(
                    (mapBoundsBuilder.build().northeast.latitude + mapBoundsBuilder
                                    .build().southwest.latitude) / 2,
                    (mapBoundsBuilder.build().northeast.longitude + mapBoundsBuilder
                                    .build().southwest.longitude) / 2))
        .zoom(map.getCameraPosition().zoom).bearing(bearing)
        .tilt(tilt).build()));

// Set mapView camera to include all locations in mapBoundsBuilder.
// Set width and height to screen size. Set padding to 50 px,
// duration to 2 sec.
map.animateCamera(CameraUpdateFactory.newLatLngBounds(
            mapBoundsBuilder.build(), size.x, mapViewHeight,
            CAMERA_PADDING), 2000, null);

但这并不能保持方位和倾斜。

4

1 回答 1

2

使用 CameraUpdate,它只改变目标和缩放:

cameraUpdate = CameraUpdateFactory.newLatLngZoom(newTarget, newZoom);

剩下的问题可能是如何计算新的缩放值。这在一定程度上取决于您在地图倾斜的情况下如何处理不同的地图宽度。但原则上,您需要地图的当前宽度与所需宽度之间的比率。使用该比率,您可以按如下方式计算新的缩放值:(如果地图显示的区域比需要的大,则比率大于 1,如果显示的区域比需要的小,则比率小于 1。)

float zoomIncrement = (float) (Math.log(ratio) / Math.log(2));
float newZoom = map.getCameraPosition().zoom + zoomIncrement;

在我的情况下,我使用从 nearLeft 到 nearRight 和从 nearLeft 到 farLeft 的两个距离中较小的一个作为地图“直径”,并将其除以包含我所有位置的 LatLngBounds 的对角线(东北和西南之间的距离)。由于 LatLngBounds 朝向北方,但地图可能会转动 45 度,这样可以确保位置始终适合地图:

double innerDiameterOfMap = getInnerDiameterOfMap(map);
double outerDiameterOfBounds = getOuterDiameterOfBounds(bounds);
double ratio = innerDiameterOfMap / outerDiameterOfBounds;

private double getOuterDiameterOfBounds(LatLngBounds bounds) {
    return getDistance(bounds.northeast,
            bounds.southwest);
}

private double getInnerDiameterOfMap(GoogleMap map) {
    double innerDiameterOfMap;
    // The diameter of the inner circle is given by the shortest side.
    VisibleRegion visibleRegion = map.getProjection().getVisibleRegion();
    double side1 = getDistance(visibleRegion.nearLeft,
            visibleRegion.nearRight);
    double side2 = getDistance(visibleRegion.farLeft,
            visibleRegion.nearLeft);
    innerDiameterOfMap = Math.min(side1, side2);
    return innerDiameterOfMap;
}

为了计算两个 LatLng 之间的距离(方法 getDistance),您会在 SO 中找到很多解决方案。

于 2013-12-27T18:14:37.707 回答