我在 GoogleMap
中有 10 个标记。我想尽可能放大并保留所有标记?在早期版本中,这可以通过 zoomToSpan()
实现,但在 v2 中我不知道如何做到这一点。此外,我知道需要可见的圆的半径。
最佳答案
您应该使用CameraUpdate
类来执行(可能)所有编程式 map 移动。
为此,首先计算所有标记的边界,如下所示:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
然后通过工厂获取运动描述对象:CameraUpdateFactory
:
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
最后移动 map :
googleMap.moveCamera(cu);
或者如果你想要动画:
googleMap.animateCamera(cu);
就这些了:)
澄清1
几乎所有移动方法都需要Map
对象通过布局过程。您可以使用 addOnGlobalLayoutListener
构造等待这一切发生。详细信息可以在该答案和其余答案的评论中找到。您还可以找到complete code for setting map extent using addOnGlobalLayoutListener
here .
澄清2
一条评论指出,仅对一个标记使用此方法会导致 map 缩放设置为“奇怪”的缩放级别(我认为这是给定位置可用的最大缩放级别)。我认为这是预期的,因为:
LatLngBounds borders
实例的northeast
属性等于southwest
,这意味着此bounds
覆盖的地球面积部分恰好为零。 (这是合乎逻辑的,因为单个标记没有区域。)- 通过将
bounds
传递给CameraUpdateFactory.newLatLngBounds
,您实质上是请求计算这样的缩放级别:bounds
(具有零面积)将覆盖整个 map View 。 - 您实际上可以在一张纸上执行此计算。答案的理论缩放级别是+∞(正无穷大)。实际上,
Map
对象不支持此值,因此它被限制为给定位置允许的更合理的最大级别。
另一种说法:Map
对象如何知道它应该为单个位置选择什么缩放级别?也许最佳值应该是 20(如果它代表特定地址)。或者也许是 11(如果它代表一个城镇)。或者也许是 6 个(如果它代表一个国家)。 API 并不那么聪明,决定取决于您。
因此,您应该简单地检查 markers
是否只有一个位置,如果是,请使用以下之一:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- 转到标记位置,保持当前缩放级别不变。CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- 转到标记位置,将缩放级别设置为任意选择的值 12。
关于Android map v2 缩放以显示所有标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524868/