Настройка максимального уровня масштабирования в google maps android api v2

В настоящее время я работаю над разработкой приложений с помощью Google maps 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 нет такого метода контроля уровня масштабирования. Кто-нибудь знает какую-либо идею для решения этой проблемы?

android,maps,zoom,

36

Ответов: 16


26

Я не нашел прямого решения в API Карт Google. Потенциальное решение этой проблемы заключается в прослушивании события OnCameraChange : всякий раз, когда это событие срабатывает, а уровень масштабирования выше максимального уровня масштабирования, можно вызвать animateCamera () . В результате код будет выглядеть следующим образом:

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

21

Недавнее обновление API Карт Google вводит требуемые функции:

GoogleMap.setMaxZoomPreference()

GoogleMap.setMinZoomPreference()

Тем не менее, это все равно не мешает анимации.


12 ов

Вот соответствующий Java-код для решения Arvis, который хорошо работал для меня:

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

10

От Android doc: 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);

6

То же, что и решение Arvis, но с использованием метода Locationss [ distanceBetween()] ( http://developer.android.com/reference/android/location/Location.html#distanceBetween(double , double, double, double, float [])) для вычисления расстояния между точками:

@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);
    }
}
андроид, карты, масштабирование,
Похожие вопросы