Noțiuni de bază cu Google Maps for Android Intermediar

Introducere

Una dintre caracteristicile cele mai utile pentru utilizatori este integrarea hărților. În tranșa anterioară a acestei serii, am discutat cum să configurați Hărți Google pentru Android utilizând Google Developer Console și cum să creați un fragment Google Maps de bază. Am continuat să adăugăm diferite tipuri de markere și cum să tragem pe hartă.

În acest tutorial, veți extinde ceea ce ați învățat în ultimul articol pentru a stabili vizualizări pe o hartă, pentru a înlocui comenzile selectorului de nivel interior și pentru a adăuga o componentă Street View la aplicațiile dvs. Codul sursă pentru acest articol poate fi găsit pe GitHub.

1. Obținerea setării

Pentru a începe, urmați pașii listați în articolul precedent din această serie pentru a crea un proiect de bază utilizând a MapFragment, atașați-o Activitate, și să activați API-ul Google Maps prin intermediul Consolei pentru dezvoltatori Google. Pentru acest tutorial, nu este necesar să utilizați clasele de locații Play Services, dar trebuie să importați hărțile de cărți ale serviciului Play Services în dvs. build.gradle dependențe nodul.

dependente compile fileTree (dir: 'libs', include: ['* .jar']) compile 'com.android.support:appcompat-v7:23.0.0' compile 'com.google.android.gms: play-services -maps: 7.8.0 '

Odată ce ați terminat, veți termina cu un ecran care arată după cum urmează:

Apoi, trebuie să configurați camera. Pentru acest tutorial, ne vom concentra pe Madison Square Garden din New York City, pentru că este un exemplu excelent al unei clădiri care utilizează hărțile de nivel interior.

În onViewCreated, puteți adăuga un apel la următoarea metodă de ajutor initCamera. S-ar putea să vă amintiți că trebuie să așteptăm până onViewCreated pentru a lucra cu Google Maps, deoarece atunci când știm că obiectul hărții este gata de utilizare.

void privat initCamera () CameraPosition position = CameraPosition.builder () .target (noul LatLng (40.7506, -73.9936)) .zoom (18f) .feria (0.0f) .tilt (0.0f) .build (); getMap (). animateCamera (CameraUpdateFactory.newCameraPosition (poziție), null); getMap () setMapType (GoogleMap.MAP_TYPE_HYBRID); 

Metoda de mai sus mișcă camera foto în țintă și zoom-ul este suficient de aproape încât selectorul interior devine vizibil. Veți observa că există o bandă de numere în partea dreaptă a ecranului și o suprapunere pe hartă pentru fiecare etaj. Când selectați un nivel diferit în partea dreaptă, planul curent planifică animația în cel nou. Aceasta este caracteristica cu care veți lucra mai târziu pentru a avea propria dvs. selectare a nivelului de control al vizualizării.

Apoi, trebuie să implementați cele trei interfețe care vor fi folosite în acest tutorial.

  • GoogleMap.OnIndoorStateChangeListener este folosit pentru a determina când un selector de nivel interior a schimbat vizibilitatea.
  • SeekBar.OnSeekBarChangeListener este folosit cu unul dintre suprapunerile noastre de vizualizare pentru a controla selectarea nivelului, mai degrabă decât să folosim setul implicit de butoane din dreapta.
  • GoogleMap.OnMapLongClickListener este utilizat în acest exemplu pentru a modifica locația afișată a componentei Street View.
clasa publică MapFragment se extinde SupportMapFragment implementează GoogleMap.OnIndoorStateChangeListener, GoogleMap.OnMapLongClickListener, SeekBar.OnSeekBarChangeListener 

Odată ce ați adăugat metodele necesare pentru aceste trei interfețe, puteți începe să adăugați vizualizări în partea superioară a hărții.

2. Suprapunerea punctelor de vedere

În timp ce caracteristicile de bază ale serviciului Hărți Google corespund celor mai multe nevoi, vor exista momente pe care doriți să adăugați vizualizări suplimentare pe hartă pentru a efectua acțiuni. Pentru acest tutorial, vom adăuga a SeekBar si ceva TextView obiecte pentru a personaliza comenzile pentru selectorul de nivel interior.

Începeți prin crearea unui nou fișier de aspect XML, view_map_overlay.xml. Adăugați următorul cod pentru a crea aspectul de bază care va fi utilizat pe ecran.

       

După ce ați finalizat fișierul de aspect, îl puteți adăuga ca o suprapunere pentru fragmentul dvs. de hărți. În onCreateView, trebuie să accesați ViewGroup părinte, umflați noua acoperire de aspect și atașați-o la părinte. De asemenea, puteți salva referințe la fiecare vizionare din suprapunere, astfel încât acestea să poată fi modificate mai târziu în aplicația dvs..

@Override publică Vizualizare onCreateView (LayoutInflater inflater, Container ViewGroup, Bundle savedInstanceState) ViewGroup părinte = (ViewGroup) super.onCreateView (inflater, container, savedInstanceState); Afișați suprapunerea = inflater.inflate (R.layout.view_map_overlay, parent, false); mIndoorSelector = (SeekBar) overlay.findViewById (R.id.indoor_level_selector); mIndoorMinLevel = (TextView) overlay.findViewById (R.id.indoor_min_level); mIndoorMaxLevel = (TextView) overlay.findViewById (R.id.indoor_max_level); parent.addView (suprapunere); retur părinte; 

Când executați aplicația, ar trebui să vedeți opiniile dvs. pe partea de sus a hărții. Veți vedea totuși, de asemenea, selectorul de nivel implicit, care aglomerează vizualizarea.

Pentru a rezolva aceasta, creați o nouă metodă numită initMapIndoorSelector și cheamă-l onViewCreated. Tot ce trebuie să faceți este să vă setați ascultătorii SeekBar și modificările nivelului de interior, precum și dezactivarea selectorului implicit de nivel interior.

private void initMapIndoorSelector () mIndoorSelector.setOnSeekBarChangeListener (aceasta); getImSettings (). setIndoorLevelPickerEnabled (false); getMap (). setOnIndoorStateChangeListener (aceasta); 

Acum, că aveți viziunea dvs. suprapunând harta, trebuie să o ascundeți până când este necesară. În onViewCreated, apelați o nouă metodă de ajutor numită hideFloorLevelSelector care ascunde toate afirmațiile tale suprapuse.

private void ascundeFloorLevelSelector () mIndoorSelector.setVisibility (View.GONE); mIndoorMaxLevel.setVisibility (View.GONE); mIndoorMinLevel.setVisibility (View.GONE); 

3. Utilizarea selectorului de nivel interior

Cu ajutorul vizualizărilor create și ascunse, puteți începe adăugarea în logică pentru a vă face să apară când este necesar și pentru a interacționa cu harta. Anterior, ați creat onIndoorBuildingFocused metode ca parte a GoogleMap.OnIndoorStateChangeListener. În această metodă, trebuie să salvați o referință la orice clădire este în foc și apoi să ascundeți sau să arătați SeekBar controlează când este necesar.

@Overide public void peIndoorBuildingFocused () mIndoorBuilding = getMap (). GetFocusedBuilding (); dacă mIndoorBuilding == null || mIndoorBuilding.getLevels () == null || mIndoorBuilding.getLevels () dimensiune () <= 1 )  hideFloorLevelSelector();  else  showFloorLevelSelector();  

O clădire interioară se va concentra atunci când clădirea este vizibilă de camera de hartă și harta este mărite suficient. Dacă aceste condiții nu mai sunt îndeplinite, această metodă va fi chemată din nou și getMap (). getFocusedBuilding va returna a nul valoare.

showFloorLevelSelector face vizibile toate vizionările suprapuse, mișcă SeekBar la valoarea selectată corectă și stabilește etichetele de text la valori care reprezintă numele scurt al etajelor de sus și de jos pentru clădirea respectivă. Când recuperați nivelele dintr-un IndoorBuilding obiect, etajul de jos este ultimul element din listă și etajul superior este în poziție 0.

privat void showFloorLevelSelector () if (mIndoorBuilding == null) retur; int numOfLevels = mIndoorBuilding.getLevels () dimensiune (); mIndoorSelector.setMax (numOfLevels - 1); // Etajul inferior este ultimul element din listă, etajul superior este primul mIndoorMaxLevel.setText (mIndoorBuilding.getLevels (). Get (0) .getShortName ()); mIndoorMinLevel.setText (mIndoorBuilding.getLevels (). obține (numOfLevels - 1) .getShortName ()); mIndoorSelector.setProgress (mIndoorBuilding.getActiveLevelIndex ()); mIndoorSelector.setVisibility (View.VISIBLE); mIndoorMaxLevel.setVisibility (View.VISIBLE); mIndoorMinLevel.setVisibility (View.VISIBLE); 

Metoda finală pe care trebuie să o implementați pentru selectorul de nivel interior este onProgressChanged (SeekBar seekBar, int progress, boolean fromUser). Cand SeekBar poziția este schimbată, trebuie să activați un nou nivel pe clădirea actuală. Deoarece nivelurile sunt ordonate de sus în jos, trebuie să activați nivelul în poziție numOfLevels - 1 - progres pentru a se corela cu poziția SeekBar.

@Override public void peProgressChanged (SeekBar seekBar, int progress, boolean b) if (mIndoorBuilding == null) retur; int numOfLevels = mIndoorBuilding.getLevels () dimensiune (); mIndoorBuilding.getLevels () obține (numOfLevels - 1 - progress) .activate (); 

4. Adăugarea Vizualizării Street View

Acum, că știți cum să suprapuneți vizualizările pe o hartă și cum să lucrați cu selectorul de nivel interior, hai să facem cum să lucrați cu Street View în aplicațiile dvs. La fel ca Google Maps, Street View vă permite să utilizați fie un fragment, fie o vizualizare. Pentru acest exemplu, veți folosi a StreetViewPanoramaView și suprapuneți-l pe dvs. MapFragment.

Această vizualizare va fi inițializată pentru a afișa strada de lângă Madison Square Garden și când apăsați lung pe o altă zonă a hărții, Street View va afișa imagini asociate poziției selectate. Dacă selectați să afișați o zonă care nu este conectată direct la o imagine Street View, Google va alege cel mai apropiat pentru a afișa dacă este într-o anumită distanță. Dacă nu există imagini în apropiere de Street View (să selectați o locație în mijlocul oceanului), Street View va afișa un ecran negru.

Altceva ce trebuie să știi este că nu poți avea decât unul StreetViewPanoramaView sau fragment vizibil pentru utilizator la un moment dat.

Pentru a începe, actualizați view_map_overlay.xml pentru a adăuga o StreetViewPanoramaView.

Când fișierul de aspect este gata, intrați onCreateView în tine MapFragment, salvați o referință la noua vizualizare și apelați onCreate metoda pentru vizualizare. Este important să sunați onCreate, deoarece fragmentul curent onCreate a fost deja apelată înainte de atașarea acestui punct de vedere, iar componenta Street View efectuează acțiuni onCreate care sunt necesare pentru inițializare.

@Override publică Vizualizare onCreateView (LayoutInflater inflater, Container ViewGroup, Bundle savedInstanceState) ViewGroup părinte = (ViewGroup) super.onCreateView (inflater, container, savedInstanceState); Afișați suprapunerea = inflater.inflate (R.layout.view_map_overlay, parent, false); mIndoorSelector = (SeekBar) overlay.findViewById (R.id.indoor_level_selector); mIndoorMinLevel = (TextView) overlay.findViewById (R.id.indoor_min_level); mIndoorMaxLevel = (TextView) overlay.findViewById (R.id.indoor_max_level); mStreetViewPanoramaView = (StreetViewPanoramaView) overlay.findViewById (R.id.steet_view_panorama); mStreetViewPanoramaView.onCreate (savedInstanceState); parent.addView (suprapunere); retur părinte; 

În continuare, în onViewCreated, adăugați o nouă metodă numită initStreetView. Această nouă metodă va primi în mod asincron StreetViewPanorama obiect atunci când este gata și mânerul care arată poziția inițială a Street View. Este important să rețineți asta getStreetViewPanoramaAsync (OnStreetViewPanoramaReadyCallback apel invers) poate fi apelat numai din firul principal.

void privat initStreetView () getMap (). setOnMapLongClickListener (acest lucru); mStreetViewPanoramaView.getStreetViewPanoramaAsync (noul OnStreetViewPanoramaReadyCallback () @Override public void onStreetViewPanoramaReady (StreetViewPanorama panorama) mPanorama = panorama; showStreetView (nou LatLng (40.7506, -73.9936));); 

În cele din urmă, trebuie să definiți showStreetView (latlng latlng) metoda helper prezentată mai sus. Această metodă creează o StreetViewPanoramaCamera obiect care vă permite să schimbați înclinarea, mărirea și orientarea camerei Street View. Pentru acest exemplu, camera este setată la valorile implicite.

Apoi, trebuie să setați poziția camerei. În acest exemplu, activăm și o setare opțională pentru a afișa numele străzilor.

private void showStreetView (LatLng latLng) dacă (mPanorama == null) retur; StreetViewPanoramaCamera.Builder builder = nou StreetViewPanoramaCamera.Builder (mPanorama.getPanoramaCamera ()); builder.tilt (0.0f); builder.zoom (0.0f); builder.bearing (0.0f); mPanorama.animateTo (builder.build (), 0); mPanorama.setPoziție (latLng, 300); mPanorama.setStreetNamesEnabled (adevărat);  

Odată ce ai fost showStreetView (latlng latlng) metoda este completă, poate fi de asemenea apelată de la onMapLongClick (LatLng latLng) astfel încât să puteți schimba cu ușurință ce zonă este afișată.

@Override publice void onMapLongClick (LatLng LatLng) showStreetView (latLng); 

Concluzie

În acest tutorial, ați aflat despre câteva modalități avansate pe care le puteți interacționa cu Google Maps prin adăugarea de vizualizări suplimentare la MapFragment și ați învățat cum să controlați selectorul nivelului clădirii interioare. De asemenea, am inclus principiile de adăugare a funcției Street View la aplicația dvs. pentru a afișa un alt punct de vedere pentru utilizatorii dvs..

În următoarea tranșă a acestei serii, veți afla despre Google Maps Utilities biblioteca și cum să o utilizați pentru a adăuga grupuri de marcaje, hărți termice și alte caracteristici utile pentru aplicațiile dvs..

Cod