studio setminzoompreference newlatlngzoom google current android google-maps android-maps

android - setminzoompreference - Google Maps API v2: LatLngBounds de CameraPosition



set zoom google maps android (2)

No puede obtener LatLngBounds de CameraPosition, pero puede obtenerlos fácilmente desde GoogleMap.

private GoogleMap mMap; mMap.setOnCameraChangeListener(new OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition position) { LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds; fetchData(bounds); } });

¿Existe una manera simple de obtener LatLngBounds del mapa visible desde CameraPosition con Android Google Maps API v2 para que pueda usar OnCameraChangeListener para ir a buscar nuevos datos para los marcadores.

mMap.setOnCameraChangeListener(new OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition position) { LatLngBounds bounds = ?; fetchNewData(bounds); } });


Actualización desde agosto de 2016

Resumen la respuesta correcta ahora para este problema es usar el nuevo onCameraIdle , en lugar de OnCameraChangeListener , que ahora está en deprecated . Lea a continuación cómo.

Ahora puede escuchar el evento tipo "dragEnd" e incluso otros eventos en la versión más reciente de Google Maps para Android.

Como se muestra en los docs , puede evitar el problema de llamadas múltiples (también conocidas como " varias ") de OnCameraChangeListener utilizando los nuevos oyentes. Por ejemplo, ahora puede verificar cuál es la razón detrás del movimiento de la cámara, que es ideal para fetchData con un problema fetchData según lo solicitado. El siguiente código se toma directamente de los documentos. Una cosa más, es necesario usar Google Play Services 9.4 .

public class MyCameraActivity extends FragmentActivity implements OnCameraMoveStartedListener, OnCameraMoveListener, OnCameraMoveCanceledListener, OnCameraIdleListener, OnMapReadyCallback { private GoogleMap mMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_camera); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap map) { mMap = map; mMap.setOnCameraIdleListener(this); mMap.setOnCameraMoveStartedListener(this); mMap.setOnCameraMoveListener(this); mMap.setOnCameraMoveCanceledListener(this); // Show Sydney on the map. mMap.moveCamera(CameraUpdateFactory .newLatLngZoom(new LatLng(-33.87365, 151.20689), 10)); } @Override public void onCameraMoveStarted(int reason) { if (reason == OnCameraMoveStartedListener.REASON_GESTURE) { Toast.makeText(this, "The user gestured on the map.", Toast.LENGTH_SHORT).show(); } else if (reason == OnCameraMoveStartedListener .REASON_API_ANIMATION) { Toast.makeText(this, "The user tapped something on the map.", Toast.LENGTH_SHORT).show(); } else if (reason == OnCameraMoveStartedListener .REASON_DEVELOPER_ANIMATION) { Toast.makeText(this, "The app moved the camera.", Toast.LENGTH_SHORT).show(); } } @Override public void onCameraMove() { Toast.makeText(this, "The camera is moving.", Toast.LENGTH_SHORT).show(); } @Override public void onCameraMoveCanceled() { Toast.makeText(this, "Camera movement canceled.", Toast.LENGTH_SHORT).show(); } @Override public void onCameraIdle() { Toast.makeText(this, "The camera has stopped moving. Fetch the data from the server!", Toast.LENGTH_SHORT).show(); LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds; fetchData(bounds) } }

Solución para una solución eficiente antes de agosto de 2016

Como la pregunta está respondida correctamente, me gustaría añadir eso en una próxima edición.

El problema surge cuando se utiliza OnCameraChangeListener para recuperar datos del servidor debido a la frecuencia con la que se desencadena este método.

Se informa un issue sobre la frecuencia con la que se desencadena este método cuando se hace un deslizamiento simple del mapa, por lo que en el ejemplo de la pregunta, desencadenaría fetchData múltiples tiempos secuenciales para muy pocos cambios en la cámara, incluso sin cambios de cámara, sí, sucede que los límites de la cámara no han cambiado, pero el método se activa.

Esto podría afectar el rendimiento del servidor y desperdiciaría muchos recursos de dispositivos al obtener datos secuencialmente decenas de veces desde el servidor.

Puede encontrar en ese enlace soluciones provisionales para este problema, pero todavía no hay una forma oficial de hacerlo, por ejemplo, utilizando un deseable dragEnd , o cameraChangeEnd callbacks.

Un ejemplo más abajo, basado en los de allí, es cómo evito el problema mencionado al jugar con el intervalo de tiempo de las llamadas y descartar las llamadas con los mismos límites.

// Keep the current camera bounds private LatLngBounds currentCameraBounds; new GoogleMap.OnCameraChangeListener() { private static int CAMERA_MOVE_REACT_THRESHOLD_MS = 500; private long lastCallMs = Long.MIN_VALUE; @Override public void onCameraChange(CameraPosition cameraPosition) { LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds; // Check whether the camera changes report the same boundaries (?!), yes, it happens if (currentCameraBounds.northeast.latitude == bounds.northeast.latitude && currentCameraBounds.northeast.longitude == bounds.northeast.longitude && currentCameraBounds.southwest.latitude == bounds.southwest.latitude && currentCameraBounds.southwest.longitude == bounds.southwest.longitude) { return; } final long snap = System.currentTimeMillis(); if (lastCallMs + CAMERA_MOVE_REACT_THRESHOLD_MS > snap) { lastCallMs = snap; return; } fetchData(bounds); lastCallMs = snap; currentCameraBounds = bounds; }