设置在谷歌最大缩放级别的Android地图API V2(Setting max zoom level

2019-08-18 05:13发布

我目前正在对使用谷歌开发应用程序的Android地图API第2版。 我的代码如下。 假设地图有几个标记和放大至在屏幕中显示的所有标记。

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不具备这样的方法来控制缩放级别。 有谁知道任何想法来解决这个问题?

Answer 1:

我还没有发现的谷歌地图API中的任何直接的解决方案。 这个问题的潜在解决方案包括在听取反对OnCameraChange事件 :每当这个事件触发和缩放级别最大变焦水平之上,可以调用animateCamera() 。 生成的代码将是如下:

@Override
public void onCameraChange(CameraPosition position) {
    float maxZoom = 17.0f;
    if (position.zoom > maxZoom)
        map_.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
}


Answer 2:

最近更新的谷歌地图API介绍您所需要的功能:

GoogleMap.setMaxZoomPreference()

GoogleMap.setMinZoomPreference()

它仍然没有阻止播放动画,虽然。



Answer 3:

下面是Arvis'解决方案,为我工作以及相应的Java代码:

private LatLngBounds adjustBoundsForMaxZoomLevel(LatLngBounds bounds) {
  LatLng sw = bounds.southwest;
  LatLng ne = bounds.northeast;
  double deltaLat = Math.abs(sw.latitude - ne.latitude);
  double deltaLon = Math.abs(sw.longitude - ne.longitude);

  final double zoomN = 0.005; // minimum zoom coefficient
  if (deltaLat < zoomN) {
     sw = new LatLng(sw.latitude - (zoomN - deltaLat / 2), sw.longitude);
     ne = new LatLng(ne.latitude + (zoomN - deltaLat / 2), ne.longitude);
     bounds = new LatLngBounds(sw, ne);
  }
  else if (deltaLon < zoomN) {
     sw = new LatLng(sw.latitude, sw.longitude - (zoomN - deltaLon / 2));
     ne = new LatLng(ne.latitude, ne.longitude + (zoomN - deltaLon / 2));
     bounds = new LatLngBounds(sw, ne);
  }

  return bounds;
}


Answer 4:

从Android的文档: https://developers.google.com/maps/documentation/android-api/views

You may find it useful to set a prefered minimum and/or maximum zoom level. For example, this is useful to control the user's experience if your app shows a defined area around a point of interest, or if you're using a custom tile overlay with a limited set of zoom levels.

    private GoogleMap mMap;
    // Set a preference for minimum and maximum zoom.
    mMap.setMinZoomPreference(6.0f);
    mMap.setMaxZoomPreference(14.0f);


Answer 5:

相同Arvis溶液,但使用Location的[ distanceBetween() ]( http://developer.android.com/reference/android/location/Location.html#distanceBetween(double ,双,双,双,浮法[]))方法来计算点之间的距离:

@Override
public void zoomToMarkers(Set<Marker> markers) {

    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker marker : markers) {
        builder.include(marker.getPosition());
    }
    LatLngBounds bounds = builder.build();

    // Calculate distance between northeast and southwest
    float[] results = new float[1];
    android.location.Location.distanceBetween(bounds.northeast.latitude, bounds.northeast.longitude,
            bounds.southwest.latitude, bounds.southwest.longitude, results);

    CameraUpdate cu = null;
    if (results[0] < 1000) { // distance is less than 1 km -> set to zoom level 15
        cu = CameraUpdateFactory.newLatLngZoom(bounds.getCenter(), 15);
    } else {
        int padding = 50; // offset from edges of the map in pixels
        cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
    }
    if (cu != null) {
        mMap.moveCamera(cu);
    }
}


Answer 6:

动画相机之前,你可以检查是否越界SW和NE点不要太靠近,必要时调整范围:

        ...
        LatLngBounds bounds = builder.Build();

        var sw = bounds.Southwest;
        var ne = bounds.Northeast;
        var deltaLat = Math.Abs(sw.Latitude - ne.Latitude);
        var deltaLon = Math.Abs(sw.Longitude - ne.Longitude);

        const double zoomN = 0.005; // set whatever zoom coefficient you need!!!
        if (deltaLat < zoomN) {
            sw.Latitude = sw.Latitude - (zoomN - deltaLat / 2);
            ne.Latitude = ne.Latitude + (zoomN - deltaLat / 2);
            bounds = new LatLngBounds(sw, ne);
        }
        else if (deltaLon < zoomN) {
            sw.Longitude = sw.Longitude - (zoomN - deltaLon / 2);
            ne.Longitude = ne.Longitude + (zoomN - deltaLon / 2);
            bounds = new LatLngBounds(sw, ne);
        }

        map.animateCamera(CameraUpdateFactory.NewLatLngBounds(bounds, 10);

PS。 我的例子是在C#中Xamarin但你可以伊斯利调整它为Java



Answer 7:

这是从API参考了include(position)你使用:

“包括这点的范围的建筑中,边界将在最小的方式,包括这点进行扩展。更确切地说,它会考虑扩大双方在向东和向西方向的边界(其中一个可以在世界各地的包裹)并选择两者中的较小。在这两个方向上产生相同大小的的LatLngBounds的情况下,这将在向东方向上它延伸。”

该地图将缩小,直到它可以显示所有你在你的for循环中添加标记。

如果你希望只缩小到17,仍然显示出标记,动画缩放17级,然后再拿到界限它,然后添加你的标记。

@Override
public void onCameraChange(CameraPosition camPos) {

    if (camPos.zoom < 17 && mCurrentLoc != null) {
        // set zoom 17 and disable zoom gestures so map can't be zoomed out
        // all the way
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(position,17));
        mMap.getUiSettings().setZoomGesturesEnabled(false);
    }
    if (camPos.zoom >= 17) {
        mMap.getUiSettings().setZoomGesturesEnabled(true);
    }

    LatLngBounds visibleBounds =  mMap.getProjection().getVisibleRegion().latLngBounds;

//add the markers


Answer 8:

@ KASIMIR的做法设置的度的最小数目无论是在经纬度,并觉得有点难以阅读。 所以我调整了它只是设置纬度,我觉得更多的是位可至少包括:

private LatLngBounds adjustBoundsForMinimumLatitudeDegrees(LatLngBounds bounds, double minLatitudeDegrees) {
    LatLng sw = bounds.southwest;
    LatLng ne = bounds.northeast;
    double visibleLatitudeDegrees = Math.abs(sw.latitude - ne.latitude);

    if (visibleLatitudeDegrees < minLatitudeDegrees) {
        LatLng center = bounds.getCenter();
        sw = new LatLng(center.latitude - (minLatitudeDegrees / 2), sw.longitude);
        ne = new LatLng(center.latitude + (minLatitudeDegrees / 2), ne.longitude);
        bounds = new LatLngBounds(sw, ne);
    }

    return bounds;
}


Answer 9:

林不知道这是否会工作,但你可以试试这个

map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

希望能帮助到你



Answer 10:

最后我做的是创造我自己的按钮和禁用默认的,所以我会拥有完全控制什么。

像这样的事情在布局中放置按钮:

<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");
        }
    }
});


Answer 11:

随着com.google.android.gms:play-services-maps:9.4.0您可以轻松地设置最小/最大变焦。 随着GoogleMap.setMinZoomPreference()GoogleMap.setMaxZoomPreference()你可以设置一个首选最小和/或最大缩放级别。 更多见这里 。



Answer 12:

我们不能直接制约地图zoomin功能,但我们可以尝试获得相同的功能是这样的。

添加map.setOnCameraChangeListener

final float maxZoom = 10.0f;

@Override
public void onCameraChange(CameraPosition position) {

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


Answer 13:

在新的谷歌地图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);

        }
    });


Answer 14:

map.setMinZoomPreference(floatValue);


Answer 15:

你可以通过调用它获得最大缩放级别getMaxZoomLevel()然后设置该值:

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


Answer 16:

该地图有一个名为MAXZOOM属性。 只需将此当您创建的地图设置为你的价值



文章来源: Setting max zoom level in google maps android api v2