12.3: Aggiungere più segnaposto alla mappa

Condividi su:

Nello scorso articolo abbiamo visto come personalizzare la mappa e abbiamo analizzato a fondo tutti i metodi e gli oggetti sfruttati per il setup di questa. Possiamo sfruttare queste nuove conoscenze per aggiungere più segnaposti sulla mappa, quindi contrassegnare luoghi diversi.





L’operazione non è difficile, poiché di fatto abbiamo già tutto e basterebbe ripetere le operazioni già effettuate. Vedremo comunque come implementare la cosa al meglio e nella maniera più pulita possibile.

Iniziamo col vedere il codice completo di MapsActivity:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private static final String TAG = "MapsActivity";

    private GoogleMap mMap;
    /*
     * Definiamo una serie di cordinate sottoforma di costanti
     */
    private final static LatLng COLOSSEO = new LatLng(41.8902142,12.4900422);
    private final static LatLng PIAZZA_PLEBISCITO = new LatLng(40.8364761,14.2460472);
    private final static LatLng DUOMO_MILANO = new LatLng(45.4641013,9.1897378);
    private final static LatLng TORRE_PISA = new LatLng(43.7229559,10.3944083);

    /*
     * Dichiariamo gli oggetti segnaposto
     */
    private Marker mColosseo;
    private Marker mPlebiscito;
    private Marker mDuomoMilano;
    private Marker mTorrePisa;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        //Recuperiamo l'istanza di GoogleMap, quindi la mappa
        mMap = googleMap;

        //Lista di segnaposto istanziata e sfruttata solo per motivi di logging
        List<Marker> markerList = new ArrayList<>();

        //Settiamo il tipo di mappa da visualizzare, ad esempio una mappa ibrida
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        /*
         * Aggiungiamo i vari segnaposto alla mappa e contestualmente li personalizziamo.
         * Col metodo "setTag()" colleghiamo un oggetto al segnaposto
         * Avendo una lista, man mano li aggiungiamo anche a questa.
         */
        mColosseo = mMap.addMarker(new MarkerOptions()
                .position(COLOSSEO)
                .title(getResources().getString(R.string.colosseo))
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
        mColosseo.setTag(0);
        markerList.add(mColosseo);

        mPlebiscito = mMap.addMarker(new MarkerOptions()
                .position(PIAZZA_PLEBISCITO)
                .title(getResources().getString(R.string.piazza_plebiscito))
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
        mPlebiscito.setTag(0);
        markerList.add(mPlebiscito);

        mDuomoMilano = mMap.addMarker(new MarkerOptions()
                .position(DUOMO_MILANO)
                .title(getResources().getString(R.string.duomo_milano))
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
        mDuomoMilano.setTag(0);
        markerList.add(mDuomoMilano);

        mTorrePisa = mMap.addMarker(new MarkerOptions()
                .position(TORRE_PISA)
                .title(getResources().getString(R.string.torre_pisa))
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)));
        mTorrePisa.setTag(0);
        markerList.add(mTorrePisa);
        
        for (Marker m : markerList){
            Log.d(TAG, "Marker: " + m.getTitle());
        }
        //Spostiamo la vista con un'animazione
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(COLOSSEO, 5));

//        LatLng sydney = new LatLng(-34, 151);
//        LatLng colosseo = new LatLng(41.8902142,12.4900422);
//
//        //Aggiungiamo il segnaposto, specificando colore, etichetta e colore
//        mMap.addMarker(new MarkerOptions().position(colosseo).title("Colosseo")
//        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
//
//        //Spostiamo la visuale sopra le cordinate da mostrare ed effettuiamo uno zoom
//        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(colosseo, 15));
    }
}

Come vedete abbiamo di fatto eliminato tutto il codice presente all’interno del metodo “onMapReady()” (eccetto l’assegnazione dell’istanza della mappa al field della classe dedicato) per implementare il nuovo codice.

La prima cosa da fare è recuperare le coordinate di tutti i luoghi da segnalare sulla mappa; per contenere questo tipo di dato vengono forniti oggetti appositi, facenti capo alla classe LatLng. Non abbiamo fatto altro che dichiarare una serie di costanti di questo tipo all’interno del quale abbiamo inserito le coordinate tramite il costruttore della classe.

Successivamente abbiamo dichiarato altrettanti field per i segnaposto, quindi oggetti di classe Marker.
L'”onCreate()” non è stato interessato da alcuna modifica, poiché stiamo semplicemente manipolando la mappa, quindi va fatto tutto all’interno del metodo “onMapReady()”.
All’interno di questo metodo, con un’unica istruzione abbiamo fatto due cose: personalizzato il segnaposto e aggiunto questo alla mappa. Abbiamo già detto che il metodo “addMarker()” si occupa appunto dell’aggiunta di un segnaposto alla mappa e questo richiede come parametro un oggetto di tipo MarkerOptions, che con i metodi forniti permette di personalizzare il segnaposto. Quello che non è stato detto è che “addMarker()” ha un valore di ritorno e questo è proprio un Marker, quello generato dal MarkerOptions.
In sintesi, oltre ad aggiungere il segnaposto alla mappa, ci premuriamo di salvare anche la sua istanza.

La classe Marker offre il metodo “setTag()“, questo permette di aggiungere un tag al segnaposto, che altro non è che un oggetto che vogliamo associargli. Può essere un oggetto arbitrario, quindi possiamo associargli un oggetto apposito contenente informazioni aggiuntive sul luogo, oppure il riferimento ad un record di un database. L’oggetto che assoceremo a tutti i segnaposto sarà l’intero “0”, vedremo nel prossimo articolo come lo sfrutteremo.

Come ultima chicca, piuttosto che utilizzare il metodo “moveCamera()”, abbiamo sfruttato “animateCamera()” che svolge praticamente la stessa funzione, spostando però la vista con un’animazione dal luogo precedente a quello in cui la stiamo destinando.

Solo per motivi di log, quindi di test, è stata creata una lista di oggetti segnaposto sfruttata per generare un log con le etichette dei segnaposto. Potete notare così che la classe Marker offre anche dei getter per prelevare le informazioni presenti nell’oggetto.



Con questo articolo possiamo terminare. Non abbiamo fatto nulla di speciale, se non sfruttare le conoscenze già acquisite per puntare più luoghi. Abbiamo comunque sfruttato qualche nuovo metodo e organizzato meglio il codice. Nel prossimo articolo vedremo come aggiungere un listener sui segnaposto e quindi gestire l’evento click su questi.

Condividi su:

label, , ,

About the author