1 ° --- Nell'attività in cui viene creata la mappa è necessario impostare l'OnCameraChangeListener e ottenere i limiti della vostra schermata come questa:
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition arg0) {
LatLngBounds bounds = mapa.getProjection().getVisibleRegion().latLngBounds;
}
2 ° --- Questo passaggio può variare in base alla modalità di recupero dei dati dei marker. In sostanza, ciò che devi fare è calcolare se lat e long di ognuno dei tuoi marcatori sono all'interno dei limiti dello schermo. Ti mostrerò come farlo recuperando i dati da una base dati SQLite memorizzando latitudine e longitudine in due diversi clomuni DOUBLE all'interno della tabella dei marcatori.
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition arg0) {
LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
LatLng northeast = bounds.northeast;
String boundLat = String.valueOf(northeast.latitude);
String boundLong = String.valueOf(northeast.longitude);
LatLng southwest = bounds.southwest;
String boundLat2 = String.valueOf(southwest.latitude);
String boundLong2 = String.valueOf(southwest.longitude);
//Remove all markers from map
mMap.clear(); // or if your a using cluster manager:
//mClusterManager.clearItems();
String[] fields = new String[] { "name", "latitude", "longitude" };
String[] args = new String[] {boundLat, boundLong, boundLat2, boundLong2,};
Cursor markers = dataBase.query("markers", fields, "latitude<=? AND longitude<=? AND latitude>=? AND longitude>=?");
if (markers.moveToFirst()) {
do {
mMap.addMarker(new MarkerOptions()
.position(new LatLng(marker.getDouble(1), marker.getDouble(2)))
.title(marker.getString(0)));
// or if you are using cluster manager create and add the items as you normaly do.
} while (c.moveToNext());
//if using cluster manager add :
//mClusterManager.cluster();
}
}
});
L'idea è abbastanza semplice, basta avere in mente che i vostri marcatori lat e Longi devono essere più piccoli rispetto alla posizione a nord est di schermo e più grande di quanto l'angolo sud-ovest, o semplicemente utilizzare la funzione LatLngBounds.contains.
Modificato:
Per evitare InfoWindow sempre chiuso quando si fa clic su un marcatore che non è già al centro dello schermo, è possibile modificare il marcatore click action listener predefinita, eliminando il movimento della fotocamera.
map.setOnMarkerClickListener(new OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker arg0) {
arg0.showInfoWindow();
return true; //must be true, if not, it will execute the default code after yours
}
});
Funziona come un fascino. Ma cosa può fare per mostrare il titolo del marcatore? Quando premo il marker, setOnCameraChangeListener() viene chiamato e chiude di nuovo il titolo. Come risolvi questo problema? Grazie! – jcasadellaoller
Ho modificato la risposta. – MauriF
Grazie mauriF. L'ho risolto, ma in un modo diverso. Ho messo un valore booleano su true su markerClickListener e false if is true su onCameraChange. Infine aggiorna solo la posizione della telecamera se il valore booleano è falso. Lo stesso risultato. Grazie ancora per il tuo tempo! – jcasadellaoller