gpt4 book ai didi

android - 动画 MapView v2 相机而不会失去方位和倾斜

转载 作者:行者123 更新时间:2023-11-29 00:27:32 26 4
gpt4 key购买 nike

我想为 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);

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

最佳答案

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

cameraUpdate = CameraUpdateFactory.newLatLngZoom(newTarget, newZoom);

剩下的问题可能是如何计算新的缩放值。这有点取决于您希望如何处理不同的 map 宽度以防 map 倾斜。但原则上,您需要 map 当前宽度与所需宽度之间的比率。使用该比率,您可以按如下方式计算新的缩放值:(如果 map 显示的面积比需要的面积大,则比率大于 1,如果显示的面积比需要的面积小,则比率小于 1。)

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

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

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 中找到很多解决方案。

关于android - 动画 MapView v2 相机而不会失去方位和倾斜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18287142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com