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

    上一篇: Android map v2 zoom to show all the markers

    下一篇: converting drawable resource image into bitmap