Google Street View offre viste panoramiche a 360° delle strade designate in tutta l'area di copertura.
Questo video mostra come utilizzare il servizio Street View per offrire agli utenti un'esperienza reale di un indirizzo sulla mappa, fornendo loro un contesto significativo sulla loro destinazione o su qualsiasi luogo a cui sono interessati.
La copertura disponibile tramite l'API Google Maps Android v2 è la stessa di quella per l'app Google Maps sul tuo dispositivo Android. Per scoprire di più su Street View e visualizzare le aree supportate su una mappa interattiva, consulta Informazioni su Street View.
La classe StreetViewPanorama
modella il panorama Street
View nella tua applicazione. Nella UI, un panorama è rappresentato da un oggetto StreetViewPanoramaFragment
o StreetViewPanoramaView
.
Esempi di codice
Il repository ApiDemos su GitHub include esempi che mostrano l'utilizzo di Street View.
Esempi di Kotlin:
- StreetViewPanoramaBasicDemoActivity: nozioni di base sull'utilizzo di Street View
- StreetViewPanoramaEventsDemoActivity: ascolto di eventi
- StreetViewPanoramaNavigationDemoActivity: controllo delle panoramiche di Street View in modo programmatico
- StreetViewPanoramaOptionsDemoActivity: modifica delle opzioni dell'interfaccia utente e dei gesti
- StreetViewPanoramaViewDemoActivity: utilizza
StreetViewPanoramaView
(anziché un Frammento) - SplitStreetViewPanoramaAndMapDemoActivity: utilizzo di un'attività che mostra un'immagine Street View e una mappa
Esempi Java:
- StreetViewPanoramaBasicDemoActivity: nozioni di base sull'utilizzo di Street View
- StreetViewPanoramaEventsDemoActivity: ascolto di eventi
- StreetViewPanoramaNavigationDemoActivity: controllo delle panoramiche di Street View in modo programmatico
- StreetViewPanoramaOptionsDemoActivity: modifica delle opzioni dell'interfaccia utente e dei gesti
- StreetViewPanoramaViewDemoActivity: utilizza
StreetViewPanoramaView
(anziché un Frammento) - SplitStreetViewPanoramaAndMapDemoActivity: crea un'attività che mostra un'immagine Street View e una mappa
Panoramica di Street View in Maps SDK for Android
Maps SDK for Android fornisce un servizio Street View per ottenere e manipolare le immagini utilizzate in Google Street View. Le immagini vengono restituite come panoramiche.
Ogni panorama di Street View è un'immagine, o un insieme di immagini, che offre una visione completa a 360 gradi da un'unica posizione. Le immagini si conformano alla proiezione equirettangolare (Plate Carrée), che contiene una visione orizzontale a 360 gradi (avvolgimento completo) e una visuale verticale di 180 gradi (dall'alto verso il basso). La panoramica a 360 gradi risultante definisce una proiezione su una sfera con l'immagine posizionata sulla superficie bidimensionale di quella sfera.
StreetViewPanorama
offre un visualizzatore che mostra
il panorama come una sfera con una fotocamera al centro. Puoi modificare StreetViewPanoramaCamera
per controllare lo zoom e l'orientamento (inclinazione e orientamento) della fotocamera.
Inizia
Configura un progetto
Segui la guida introduttiva per configurare un progetto Maps SDK for Android.
Verifica la disponibilità di panoramiche in Street View prima di aggiungerne una
La libreria client dell'SDK Google Play Services include alcuni esempi di Street View che puoi importare nel tuo progetto e utilizzare come base per lo sviluppo. Consulta l'introduzione per le linee guida sull'importazione dei campioni.
La Libreria di utilità di Maps SDK for Android è una libreria open source di classi utili per una vasta gamma di applicazioni. Nel repository GitHub è inclusa
l'utilità per i metadati di Street View.
Questa utilità verifica se una località è supportata da Street View. Puoi evitare errori durante l'aggiunta di una panoramica di Street View a un'app per Android richiamando questa utilità di metadati e aggiungendo una panoramica di Street View solo se la risposta è OK
.
Utilizzare l'API
Segui le istruzioni riportate di seguito per aggiungere una panoramica Street View a un frammento Android. Questo è il modo più semplice per aggiungere Street View alla tua applicazione. Leggi ulteriori informazioni su frammenti, viste e personalizzazione del panorama.
Aggiungi una panoramica di Street View
Per aggiungere una panoramica di Street View come questa:
In sintesi:
- Aggiungi un oggetto Frammento all'Attività che gestirà la panoramica di Street View. Il modo più semplice per farlo è
aggiungere un elemento
<fragment>
al file di layout perActivity
. - Implementa l'interfaccia
OnStreetViewPanoramaReadyCallback
e utilizza il metodo di callback dionStreetViewPanoramaReady(StreetViewPanorama)
per ottenere un handle all'oggettoStreetViewPanorama
. - Chiama
getStreetViewPanoramaAsync()
sul frammento per registrare il callback.
Di seguito sono riportati maggiori dettagli su ciascun passaggio.
Aggiungi un frammento
Aggiungi un elemento <fragment>
al file di layout dell'attività per definire un
oggetto Fragment. In questo elemento, imposta l'attributo class
su com.google.android.gms.maps.StreetViewPanoramaFragment
(o
SupportStreetViewPanoramaFragment
).
Ecco un esempio di frammento in un file di layout:
<fragment android:name="com.google.android.gms.maps.StreetViewPanoramaFragment" android:id="@+id/streetviewpanorama" android:layout_width="match_parent" android:layout_height="match_parent"/>
Aggiungi il codice Street View
Per utilizzare la panoramica di Street View all'interno dell'app, devi implementare
l'interfaccia OnStreetViewPanoramaReadyCallback
e impostare un'istanza del callback su un oggetto
StreetViewPanoramaFragment
o
StreetViewPanoramaView
. Questo tutorial utilizza un
StreetViewPanoramaFragment
, perché questo è il modo più semplice per aggiungere Street View
alla tua app. Il primo passaggio è implementare l'interfaccia di callback:
Kotlin
class StreetViewActivity : AppCompatActivity(), OnStreetViewPanoramaReadyCallback { // ... }
Java
class StreetViewActivity extends AppCompatActivity implements OnStreetViewPanoramaReadyCallback { // ... }
Nel metodo onCreate()
di Activity
, imposta il file di layout come visualizzazione dei contenuti. Ad esempio, se il file di layout
ha il nome main.xml
, utilizza questo codice:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_street_view) val streetViewPanoramaFragment = supportFragmentManager .findFragmentById(R.id.street_view_panorama) as SupportStreetViewPanoramaFragment streetViewPanoramaFragment.getStreetViewPanoramaAsync(this) }
Java
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_street_view); SupportStreetViewPanoramaFragment streetViewPanoramaFragment = (SupportStreetViewPanoramaFragment) getSupportFragmentManager() .findFragmentById(R.id.street_view_panorama); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this); }
Ottieni un handle al frammento chiamando
FragmentManager.findFragmentById()
,
passandogli l'ID risorsa dell'elemento <fragment>
.
Tieni presente che l'ID risorsa R.id.streetviewpanorama
viene aggiunto automaticamente al progetto Android quando crei il file di layout.
Quindi utilizza getStreetViewPanoramaAsync()
per impostare il callback sul frammento.
Kotlin
val streetViewPanoramaFragment = supportFragmentManager .findFragmentById(R.id.street_view_panorama) as SupportStreetViewPanoramaFragment streetViewPanoramaFragment.getStreetViewPanoramaAsync(this)
Java
SupportStreetViewPanoramaFragment streetViewPanoramaFragment = (SupportStreetViewPanoramaFragment) getSupportFragmentManager() .findFragmentById(R.id.street_view_panorama); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);
Utilizza il metodo di callback onStreetViewPanoramaReady(StreetViewPanorama)
per recuperare un'istanza con valore non nullo di StreetViewPanorama
, pronta per essere utilizzata.
Kotlin
override fun onStreetViewPanoramaReady(streetViewPanorama: StreetViewPanorama) { val sanFrancisco = LatLng(37.754130, -122.447129) streetViewPanorama.setPosition(sanFrancisco) }
Java
@Override public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) { LatLng sanFrancisco = new LatLng(37.754130, -122.447129); streetViewPanorama.setPosition(sanFrancisco); }
Scopri di più sulla configurazione dello stato iniziale
A differenza di una mappa, non è possibile configurare lo stato iniziale della panoramica Street View tramite XML. Tuttavia, puoi configurare
il panorama in modo programmatico passando un oggetto
StreetViewPanoramaOptions
contenente le opzioni specificate.
- Se usi un
StreetViewPanoramaFragment
, usa il metodo di fabbrica staticoStreetViewPanoramaFragment.newInstance(StreetViewPanoramaOptions options)
per creare il frammento e trasferire le opzioni configurate personalizzate. - Se usi un
StreetViewPanoramaView
, usa il costruttoreStreetViewPanoramaView(Context, StreetViewPanoramaOptions)
e trasmetti le opzioni di configurazione personalizzate.
Kotlin
val sanFrancisco = LatLng(37.754130, -122.447129) val view = StreetViewPanoramaView( this, StreetViewPanoramaOptions().position(sanFrancisco) )
Java
LatLng sanFrancisco = new LatLng(37.754130, -122.447129); StreetViewPanoramaView view = new StreetViewPanoramaView(this, new StreetViewPanoramaOptions().position(sanFrancisco));
Scopri di più su StreetViewPanoramaFragment
StreetViewPanoramaFragment
è una sottoclasse della classe Android Fragment e consente di inserire un panorama di Street View in un frammento Android. Gli oggetti StreetViewPanoramaFragment
fungono
da contenitori per il panorama e forniscono l'accesso all'oggetto StreetViewPanorama
.
StreetViewPanoramaView
StreetViewPanoramaView
, una sottoclasse della classe Android View
, ti consente di inserire un panorama di Street View in un View
per Android. L'elemento View
rappresenta un'area rettangolare dello
schermo ed è un componente di base fondamentale per i widget e le app Android.
Proprio come un StreetViewPanoramaFragment
, lo StreetViewPanoramaView
funge da
contenitore per la panoramica, esponendo le funzionalità di base tramite
l'oggetto StreetViewPanorama
. Gli utenti di questa classe devono inoltrare tutti i metodi del ciclo di vita delle attività (come onCreate()
, onDestroy()
, onResume()
e onPause())
ai metodi corrispondenti nella classe StreetViewPanoramaView
.
Personalizza la funzionalità controllata dall'utente
Per impostazione predefinita, quando visualizza una panoramica in Street View sono disponibili le seguenti funzionalità: panoramica, zoom e spostamento verso panoramiche adiacenti. Puoi attivare e disattivare i gesti controllati dall'utente
tramite i metodi su StreetViewPanorama
. Se il gesto viene disattivato, le modifiche
programmatiche sono comunque possibili.
Impostare la posizione del panorama
Per impostare la posizione della panoramica di Street View, chiama
StreetViewPanorama.setPosition()
, trasmettendo una LatLng
.
Puoi anche trasmettere radius
e source
come parametri facoltativi.
Il raggio è utile per ampliare o restringere l'area in cui Street View cercherà una panoramica corrispondente. Un raggio
di 0 indica che la panoramica deve essere collegata esattamente al LatLng
specificato.
Il raggio predefinito è 50 metri. Se nell'area corrispondente sono presenti più panoramiche, l'API restituirà la corrispondenza migliore.
Una sorgente è utile se vuoi limitare Street View alla ricerca solo di panoramiche all'aperto. Per impostazione predefinita, i panorami di Street View possono trovarsi all'interno di luoghi quali musei, edifici pubblici, bar e attività. Tieni presente che le panoramiche di esterni potrebbero non esistere per la posizione specificata.
Kotlin
val sanFrancisco = LatLng(37.754130, -122.447129) // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco) // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20) // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR) // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR)
Java
LatLng sanFrancisco = new LatLng(37.754130, -122.447129); // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco); // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20); // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR); // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR);
In alternativa, puoi impostare la posizione in base a un ID panorama trasmettendo un
panoId
a StreetViewPanorama.setPosition()
.
Per recuperare l'ID per le panoramiche adiacenti, utilizza innanzitutto
getLocation()
per recuperare un StreetViewPanoramaLocation
.
Questo oggetto contiene l'ID della panoramica corrente e un array di StreetViewPanoramaLink
oggetti, ognuno dei quali contiene l'ID di una panoramica collegata a quella corrente.
Kotlin
streetViewPanorama.location.links.firstOrNull()?.let { link: StreetViewPanoramaLink -> streetViewPanorama.setPosition(link.panoId) }
Java
StreetViewPanoramaLocation location = streetViewPanorama.getLocation(); if (location != null && location.links != null) { streetViewPanorama.setPosition(location.links[0].panoId); }
Aumentare e diminuire lo zoom
Puoi modificare il livello di zoom in modo programmatico impostando
StreetViewPanoramaCamera.zoom
.
Impostando lo zoom su 1,0, l'immagine verrà ingrandita di 2 volte.
Lo snippet seguente utilizza StreetViewPanoramaCamera.Builder()
per costruire una
nuova videocamera con inclinazione e orientamento di quella esistente, aumentando
lo zoom del cinquanta percento.
Kotlin
val zoomBy = 0.5f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom + zoomBy) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing) .build()
Java
float zoomBy = 0.5f; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom + zoomBy) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing) .build();
Impostare l'orientamento della fotocamera (punto di vista)
Puoi determinare l'orientamento della fotocamera di Street View impostando
cuscinetto e inclinazione su StreetViewPanoramaCamera
.
- bearing
- La direzione in cui è rivolta la videocamera, espressa in gradi in senso orario dal vero nord, intorno al locus della videocamera. Il vero nord è 0, l'est è 90, il sud è 180 e l'ovest è 270.
- inclinazione
- L'asse Y si inclina verso l'alto o verso il basso. L'intervallo va da -90 a 0 e 90, con -90 rivolto verso il basso, 0 centrato sull'orizzonte e 90 rivolto verso l'alto. La varianza viene misurata in base al tono predefinito iniziale della videocamera, che spesso (ma non sempre) è orizzontale. Ad esempio, un'immagine scattata su una collina probabilmente avrà un'inclinazione predefinita non orizzontale.
Lo snippet seguente utilizza StreetViewPanoramaCamera.Builder()
per costruire una
nuova videocamera con lo zoom e l'inclinazione della videocamera esistente, modificando
il cuscinetto di 30 gradi a sinistra.
Kotlin
val panBy = 30f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - panBy) .build()
Java
float panBy = 30; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - panBy) .build();
Il seguente snippet inclina la fotocamera verso l'alto di 30 gradi.
Kotlin
var tilt = streetViewPanorama.panoramaCamera.tilt + 30 tilt = if (tilt > 90) 90f else tilt val previous = streetViewPanorama.panoramaCamera val camera = StreetViewPanoramaCamera.Builder(previous) .tilt(tilt) .build()
Java
float tilt = streetViewPanorama.getPanoramaCamera().tilt + 30; tilt = (tilt > 90) ? 90 : tilt; StreetViewPanoramaCamera previous = streetViewPanorama.getPanoramaCamera(); StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder(previous) .tilt(tilt) .build();
Anima i movimenti della videocamera
Per animare i movimenti della fotocamera, chiama
StreetViewPanorama.animateTo()
.
L'animazione interpola tra gli attributi correnti della videocamera e i nuovi
attributi della videocamera. Se vuoi passare direttamente alla videocamera
senza animazione, puoi impostare la durata su 0.
Kotlin
// Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. val duration: Long = 1000 val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - 60) .build() streetViewPanorama.animateTo(camera, duration)
Java
// Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. long duration = 1000; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - 60) .build(); streetViewPanorama.animateTo(camera, duration);
L'immagine seguente mostra il risultato quando pianifichi l'esecuzione dell'animazione precedente ogni 2000 millisecondi utilizzando Handler.postDelayed()
: