我想为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);
但这并不能保持轴承和倾斜。
答案 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中找到很多解决方案。