动画MapView v2相机,不会失去轴承和倾斜

时间:2013-08-17 09:16:29

标签: android google-maps android-mapview google-maps-android-api-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);

但这并不能保持轴承和倾斜。

1 个答案:

答案 0 :(得分:1)

使用CameraUpdate,它仅更改目标和缩放:

cameraUpdate = CameraUpdateFactory.newLatLngZoom(newTarget, newZoom);

剩下的问题可能是如何计算新的缩放值。 在地图倾斜的情况下,它取决于您希望如何处理不同的地图宽度。但原则上,您需要地图当前宽度与所需宽度之间的比率。 使用该比率,您可以按如下方式计算新的缩放值: (如果map显示的区域大于所需区域,则比率大于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中找到很多解决方案。