Android地图v2缩放以显示所有标记
我在GoogleMap
有10个标记。 我想尽可能放大并保留所有标记? 在早期版本中,这可以通过zoomToSpan()
来实现,但在v2中我不知道如何做到这一点。 此外,我知道需要可见的圆的半径。
您应该使用CameraUpdate
类(可能)执行所有程序化的地图移动。
为此,首先计算所有标记的界限,如下所示:
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);
最后移动地图:
googleMap.moveCamera(cu);
或者如果你想要一个动画:
googleMap.animateCamera(cu);
就这样 :)
澄清1
几乎所有的移动方法都需要Map
对象通过布局过程。 您可以使用addOnGlobalLayoutListener
构造等待这种情况。 详细信息可以在评论中找到这个答案和其余的答案。 您也可以在这里使用addOnGlobalLayoutListener
找到设置地图范围的完整代码。
澄清2
一个评论指出,只有一个标记使用此方法会导致地图缩放设置为“奇怪”的缩放级别(我认为这是最大缩放级别,可用于给定位置)。 我认为这是预期的,因为:
LatLngBounds bounds
实例的northeast
属性等于southwest
,这意味着由这个bounds
覆盖的地球部分恰好为零。 (这是合乎逻辑的,因为一个标记没有区域。) bounds
传递给CameraUpdateFactory.newLatLngBounds
您基本上要求计算一个这样的缩放级别,该bounds
(具有零区域)将覆盖整个地图视图。 Map
对象不支持这个值,所以它被限制在给定位置允许的更合理的最大级别。 另一种说法是: Map
对象如何知道它为一个位置选择的缩放级别? 也许最佳值应该是20(如果它代表特定的地址)。 或者也许11(如果它代表一个城镇)。 或者,也许6(如果它代表一个国家)。 API不是那么聪明,这个决定取决于你。
所以,你应该简单地检查一下markers
是否只有一个位置,如果是的话,使用下面的一个:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- 转到标记位置,保持当前缩放级别不变。 CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- 转到标记位置,将缩放级别设置为任意选择的值12。 Google Map V2:界限内的Zoom MarkerOptions同样适用于Android Marshmallow 6(API 23,API 24,API 25)的最佳工作解决方案,也适用于Xamarin
LatLngBounds.Builder builder = new LatLngBounds.Builder();
//the include method will calculate the min and max bound.
builder.include(marker1.getPosition());
builder.include(marker2.getPosition());
builder.include(marker3.getPosition());
builder.include(marker4.getPosition());
LatLngBounds bounds = builder.build();
int width = getResources().getDisplayMetrics().widthPixels;
int height = getResources().getDisplayMetrics().heightPixels;
int padding = (int) (width * 0.10); // offset from edges of the map 10% of screen
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);
mMap.animateCamera(cu);
所以
我需要使用addOnGlobalLayoutListener来获取适当的样本
例如,您的Google地图位于RelativeLayout内部:
RelativeLayout mapLayout = (RelativeLayout)findViewById(R.id.map_layout);
mapLayout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//and write code, which you can see in answer above
}
});
链接地址: http://www.djcxy.com/p/63785.html