我有 10 个标记GoogleMap。我想尽可能放大并保留所有标记?在早期版本中,这可以实现,zoomToSpan()但在 v2 中,我不知道该怎么做。此外,我知道需要可见的圆的半径。
GoogleMap
zoomToSpan()
您应该使用CameraUpdate该类来执行(可能)所有程序化地图移动。
CameraUpdate
为此,首先计算所有标记的边界,如下所示:
LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (Marker marker : markers) { builder.include(marker.getPosition()); } LatLngBounds bounds = builder.build();
然后通过工厂获取一个动作描述对象CameraUpdateFactory::
CameraUpdateFactory
int padding = 0; // offset from edges of the map in pixels CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
最后移动地图:
googleMap.moveCamera(cu);
或者如果你想要一个动画:
googleMap.animateCamera(cu);
就这样 :)
说明 1
几乎所有的移动方法都要求Map对象已经通过了布局过程。addOnGlobalLayoutListener您可以使用构造等待这种情况发生。可以在对此答案和剩余答案的评论中找到详细信息。
Map
addOnGlobalLayoutListener
说明 2
一条评论指出,仅对一个标记使用此方法会导致地图缩放设置为“奇异”缩放级别(我认为这是给定位置可用的最大缩放级别)。我认为这是意料之中的,因为:
LatLngBounds bounds
northeast
southwest
bounds
CameraUpdateFactory.newLatLngBounds
另一种说法:对象如何知道它应该为 单个位置Map选择什么缩放级别?也许最佳值应该是 20(如果它代表一个特定的地址)。或者可能是 11(如果它代表一个城镇)。或者可能是 6(如果它代表一个国家)。API 不是那么聪明,决定权在你。 __
因此,您应该简单地检查是否markers只有一个位置,如果是,请使用以下之一:
markers
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)