在Google地图Android API V2中设置最大缩放级别

41

我目前正在使用Google地图Android API v2开发应用程序。 我的代码如下。 假设地图上有几个标记,并缩放以显示所有标记。

LatLngBuilder.Builder builder = LatLngBounds.builder();
for(Marker m : markers){
    builder.include(m.getPosition());
}
LatLngBounds bounds = builder.build();
map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10);

这段代码运行良好,但我希望在缩放级别达到17.0f时停止动画; 似乎地图API没有控制缩放级别的方法。 有人知道解决这个问题的任何想法吗?

17个回答

0
map.setMinZoomPreference(floatValue);

2
请考虑添加一些描述文本以提高您的答案质量。 - Kalamarico

0
我最终做的是创建自己的按钮并禁用默认按钮,以便我可以完全控制。
在布局中放置按钮的代码如下:
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="bottom"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true">

    <Button
        android:id="@+id/bzoomin"
        android:layout_width="55dp"
        android:layout_height="55dp"
        android:gravity="center"
        android:textSize="28sp"
        android:text="+" />
    <Button
            android:id="@+id/bzoomout"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:gravity="center"
            android:textSize="23sp"
            android:text="—" />
</LinearLayout>

然后在代码中禁用默认按钮并设置我们的新按钮:

map.getUiSettings().setZoomControlsEnabled(false);

// setup zoom control buttons
Button zoomout = (Button) findViewById(R.id.bzoomout);
zoomout.setOnClickListener(new OnClickListener(){

    @Override
    public void onClick(View v) {
        if(map.getCameraPosition().zoom >= 8.0f){
            // Zoom like normal
            map.animateCamera(CameraUpdateFactory.zoomOut());
        }else{
            // Do whatever you want if user went too far
            Messages.toast_short(MapsActivity.this, "Maximum zoom out level reached");
        }
    }

});

Button zoomin = (Button) findViewById(R.id.bzoomin);
zoomin.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        if (map.getCameraPosition().zoom <= 14.0f) {
            // Zoom like normal
            map.animateCamera(CameraUpdateFactory.zoomIn());
        } else {
            // Do whatever you want if user went too far
            Messages.toast_short(MapsActivity.this, "Maximum zoom in level reached");
        }
    }
});

1
嗨@William W.这解决了按钮问题,但屏幕上的手指捏合和缩放怎么办? - Ignacio Rubio
@IgnacioRubio 您可以使用 map.getUiSettings().setAllGesturesEnabled(false) 禁用所有手势,或者只是禁用捏合缩放手势 map.getUiSettings().setZoomGesturesEnabled(false) - William W
1
但是,禁用缩放手势的地图会给用户带来糟糕的体验。我的意思是,我想将缩放设置为最大级别,但我希望用户可以使用按钮和手指手势。我已经发现在OSM API中存在此功能:https://code.google.com/p/osmdroid/issues/detail?id=418 但我正在使用Google Maps,所以我需要找到解决方法。 - Ignacio Rubio
1
@IgnacioRubio非常正确,大多数情况下禁用捏合缩放都是不好的用户体验。但在我的情况下,这就是我最终采取的措施。我尝试过的唯一方法是Tisys的答案。然而,虽然从技术上讲它可以工作,但它并不是很好用,对用户来说更加令人沮丧。我还没有研究本页面上的其他建议。 - William W
我已经使用过Tisys解决方案了,对我来说它运行良好。的确,在某个瞬间用户可能会缩放超过最大缩放级别(因为onCameraChange在动画之后被调用)。但是缩放很快就会恢复到最大值。(如果API像OSM一样有"setMaxZoomLevel"方法会更好,但对我来说这已经完美了) - Ignacio Rubio

0
使用com.google.android.gms:play-services-maps:9.4.0,您可以轻松设置最小/最大缩放级别。通过GoogleMap.setMinZoomPreference()GoogleMap.setMaxZoomPreference(),您可以设置首选的最小和/或最大缩放级别。更多信息请参见这里

0
我们无法直接限制地图缩放功能,但我们可以尝试获得类似的功能。
添加map.setOnCameraChangeListener。
final float maxZoom = 10.0f;

@Override
public void onCameraChange(CameraPosition position) {

    if (position.zoom > maxZoom)
        map.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
}

0

在新的Google Maps 9.8上

com.google.android.gms:play-services-maps:9.8.0

这是我做的方式,而且有效。

    googleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
        @Override
        public void onCameraMove() {
            Log.d(App.TAG, "onCameraMove");

            CameraPosition position = googleMap.getCameraPosition();

            float maxZoom = 9.0f;
            if (position.zoom > maxZoom) {

                googleMap.setMinZoomPreference(maxZoom);
            }

            Log.d(App.TAG, "position.zoom = " + position.zoom);

        }
    });

-2

您可以通过调用 getMaxZoomLevel() 方法来获取最大缩放级别,然后将该值设置为:

mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(fromPosition, getMaxZoomLevel()));

1
嗨,我尝试了一下。newLatLngZoom似乎不能使用LatLngBounds。我想缩放所有标记,包括且缩放级别<= 17.0。 - user2223820

-4
地图有一个名为maxZoom的属性。在创建地图时,只需将其设置为您的值即可。

谢谢您的评论。它在API v2上也可用吗?我在GoogleMap对象中没有看到任何类似maxZoom的项目。 - user2223820
我也看不到这样的属性。它是在Android还是js上? - ronme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接