Komme i gang med Google Maps for Android: Intermediate

Getting gang med Google Maps for Android: Intermediate
15
Del
31
Del

Denne Cyber ​​Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie kalt Komme i gang med Google Maps for Android.Getting gang med Google Maps for Android. BasicsGetting gang med Google Maps for Android: Avanserte
Innledning
< p> En av de mest nyttige funksjoner for brukerne er maps integrasjon. I forrige utgaven av denne serien, diskuterte vi hvordan du setter opp Google Maps for Android via Google utviklerkonsollen og hvordan du oppretter en grunnleggende Google Maps fragment. Vi deretter gikk over å legge ulike typer av markører og hvordan du kan tegne på kartet.

I denne opplæringen, vil du utdype hva du har lært i den siste artikkelen for å legge syn på toppen av et kart, overstyring innendørs nivå velger kontroller, og legge til en Street View-komponent i programmene. Kildekoden for denne artikkelen kan bli funnet på GitHub.

1. Å få satt opp

For å starte, må du følge trinnene i den forrige artikkelen i denne serien for å skape en grunnleggende prosjekt ved hjelp av en MapFragment og fest den til en aktivitet, og aktivere Google Maps API gjennom Google Developers Console. . For denne opplæringen, trenger du ikke å bruke de stedene Play Tjenester klasser, men du trenger ikke å importere kart Play Services bibliotek i din build.gradle avhengig node
avhengig {kompilere fileTree (dir: 'libs', omfatter : [ '* .jar']) kompilere 'com.android.support:appcompat-v7:23.0.0' kompilere 'com.google.android.gms: play-tjenester-kart: 7.8.0'}

Når det er gjort, du ende opp med en skjerm som ser ut som følgende:

Deretter må du sette opp kameraet. For denne opplæringen, vil vi fokusere på Madison Square Garden i New York City, fordi det er et godt eksempel på en bygning med innendørs nivå kart.

I onViewCreated, kan du legge et kall til følgende hjelperen metode initCamera. Du husker kanskje at vi må vente til onViewCreated å jobbe med Google Maps, fordi dette er når vi vet kartobjektet er klar til bruk.
Private void initCamera () {kameraposisjon stilling = CameraPosition.builder () .target ( ny LatLng (40,7506, -73,9936)) .zoom (18f) .bearing (0.0f) .tilt (0.0f) att bygga (); . GetMap () animateCamera (CameraUpdateFactory.newCameraPosition (posisjon), null); . GetMap () setMapType (GoogleMap.MAP_TYPE_HYBRID);}

Metoden over beveger kameraet til våre mål og zoomer inn nær nok at innendørsvelgeren blir synlig. Du vil merke at det er en stripe med tall på høyre side av skjermen og et overlegg på kartet for hver etasje. Når du velger et annet nivå på høyre, animerer dagens planløsning i den nye. Dette er den funksjonen som du vil jobbe med senere for å få ditt eget syn kontrollnivået utvalg.

Deretter må du gjennomføre de tre grensesnitt som vil bli brukt i denne opplæringen.

GoogleMap.OnIndoorStateChangeListener brukes for å bestemme når en innendørs nivå velgeren har endret synlighet.

SeekBar.OnSeekBarChangeListener brukes sammen med en av våre vise overlegg for å kontrollere nivået utvalg, i stedet for å bruke standard sett med knapper på høyre.

GoogleMap.OnMapLongClickListener brukes i dette eksemplet for å endre den viste plasseringen av Street View komponent.
public class MapFragment strekker SupportMapFragment implementerer GoogleMap.OnIndoorStateChangeListener, GoogleMap.OnMapLongClickListener, seekbar. OnSeekBarChangeListener {

Når du har lagt til de nødvendige metoder for de tre grensesnitt, kan du begynne å legge utsikt på toppen av kartet.

2. Liggende Visninger

Mens base funksjonene i Google Maps passer de fleste behov, vil det være ganger du vil legge til flere utsikt over kartet for å utføre handlinger. For denne opplæringen, vil vi legge til en seekbar og noen TextView objekter for å tilpasse kontrollene for innendørs nivå velgeren.

Start med å opprette en ny XML layout fil, view_map_overlay.xml. .? Legg til følgende kode for å lage basen layout som skal brukes på skjermen
< xml version = "1.0" encoding = "UTF-8" > < RelativeLayout xmlns: android = "http: //schemas.android.com/apk/res/android "android: layout_width =" match_parent "android: layout_height =" match_parent "> ≪ LinearLayout android: layout_width = "match_parent" android: layout_height = "wrap_content" > ≪ TextView android: id = "+ id /indoor_min_level" android: text = "0" android: layout_width = "0DP" android: layout_height = "wrap_content" android: layout_weight = "1" android: padding = "4DP" android : Tekststørrelse = "20sp" android: vekt = "center" android: textcolor = "@ android: farge /hvit" /> ≪ seekbar android: id = "+ id /indoor_level_selector" android: layout_width = "0DP" android: layout_height = "wrap_content" android: layout_weight = "8" /> ≪ TextView android: id = "+ id /indoor_max_level" android: text = "10" android: layout_width = "0DP" android: layout_height = "wrap_content" android: layout_weight = "1" android: padding = "4DP" android : Tekststørrelse = "20sp" android: textcolor = "@ android: farge /hvit" android: vekt = "center" /> ≪ /LinearLayout > ≪ /RelativeLayout >

Når layout filen er ferdig, kan du legge den som et overlegg til kart fragment. I onCreateView, må du få tilgang til ViewGroup forelder, blåse opp ny layout overlegg, og fest den til den overordnede. Dette er også hvor du lagrer referanser til hver av visninger i overlegg slik at de kan endres senere i programmet ditt.
Overridepublic Vis onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {ViewGroup forelder = (ViewGroup) super.onCreateView (inflater, container, savedInstanceState); Vis overlegg = inflater.inflate (R.layout.view_map_overlay, foreldre, 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 (overlay); returnere forelder;}

Når du kjører programmet, bør du se dine synspunkter på toppen av kartet. Du vil imidlertid også fortsatt se standardnivå velgeren, som rote opp visningen.

For å fikse dette ved å opprette en ny metode som heter initMapIndoorSelector og kaller det fra onViewCreated. Alt den trenger å gjøre, er satt dine lyttere for seekbar og innendørs nivå endringer, samt deaktivere standard innendørs nivå picker
private void initMapIndoorSelector () {mIndoorSelector.setOnSeekBarChangeListener (dette).; GetMap () getUiSettings () setIndoorLevelPickerEnabled (false)..; . GetMap () setOnIndoorStateChangeListener (denne);}

Nå som du har ditt syn overliggende kartet, må du skjule det før det er nødvendig. . I onViewCreated, kaller en ny medhjelper metode kalt hideFloorLevelSelector som skjuler alle dine kledde synspunkter
private void hideFloorLevelSelector () {mIndoorSelector.setVisibility (View.GONE); mIndoorMaxLevel.setVisibility (View.GONE); mIndoorMinLevel.setVisibility (View.GONE);}
3. Bruke Innendørs nivå Selector

Med dine synspunkter opprettet og skjult, kan du begynne å legge i logikken for å gjøre dine synspunkter vises når det trengs og samhandle med kartet. Tidligere skapte dere onIndoorBuildingFocused metoden som en del av GoogleMap.OnIndoorStateChangeListener. I denne metoden, må du lagre en referanse til hvilken bygning er i fokus, og deretter skjule eller vise seekbar kontroller når det er nødvendig
Overridepublic ugyldig onIndoorBuildingFocused () {mIndoorBuilding = GetMap () getFocusedBuilding ()..; if (mIndoorBuilding == null || mIndoorBuilding.getLevels () == null || mIndoorBuilding.getLevels () størrelse (). < = 1) {hideFloorLevelSelector (); } Else {showFloorLevelSelector (); }}

Et innendørs bygningen vil få fokus når bygningen er synlig for kartet kamera og kartet er zoomet inn nok. Hvis disse vilkårene ikke lenger er oppfylt, vil denne metoden bli kalt igjen og GetMap (). GetFocusedBuilding vil returnere en nullverdi.

showFloorLevelSelector gjør alle de overliggende visninger synlige, beveger seekbar til riktig valgt verdi, og setter tekstetiketter til verdier som representerer kortnavnet på de øverste og nederste etasjene for at bygningen. Når du henter nivåene fra et IndoorBuilding objekt, er den nederste etasjen det siste elementet i listen, og i øverste etasje er i posisjon 0.
private void showFloorLevelSelector () {if (mIndoorBuilding == null) tilbake; int numOfLevels = mIndoorBuilding.getLevels () størrelse (.); mIndoorSelector.setMax (numOfLevels - 1); //Nederste etasje er det siste elementet i listen, er toppetasjen første mIndoorMaxLevel.setText (mIndoorBuilding.getLevels () får (0) .getShortName ().); mIndoorMinLevel.setText (. mIndoorBuilding.getLevels () få (numOfLevels - 1) .getShortName ()); mIndoorSelector.setProgress (mIndoorBuilding.getActiveLevelIndex ()); mIndoorSelector.setVisibility (View.VISIBLE); mIndoorMaxLevel.setVisibility (View.VISIBLE); mIndoorMinLevel.setVisibility (View.VISIBLE);}

Den siste metoden du trenger for å implementere for innendørs nivå velgeren onProgressChanged (seekbar seekbar, int fremgang, boolsk fromUser). Når seekbar posisjonen endres, må du aktivere et nytt nivå på nåværende bygg. Siden nivåene er bestilt fra topp til bunn, må du aktivere det nivået posisjon numOfLevels - 1 - fremgang for å korrelere med plasseringen av seekbar
Overridepublic ugyldig onProgressChanged (seekbar seekbar, int fremgang, boolean b. ) {if (mIndoorBuilding == null) tilbake; int numOfLevels = mIndoorBuilding.getLevels () størrelse (.); . MIndoorBuilding.getLevels () får (numOfLevels - 1 - pågår) .activate ();}
4. Legge Street View

Nå som du vet hvordan du skal overlappe synspunkter på et kart og hvordan du arbeider med innendørs nivå velgeren, la oss hoppe inn i hvordan du arbeider med Street View i dine apps. Akkurat som Google Maps, kan Street View du enten bruke et fragment eller utsikt. For dette eksempelet, vil du bruke en StreetViewPanoramaView og kle det på din MapFragment.

Dette synet vil bli initialisert for å vise gaten ved siden av Madison Square Garden, og når du lang trykker på et annet område av kartet, street View vil vise bilder knyttet til den valgte posisjonen. Hvis du velger å vise et område som ikke er direkte koblet til en Street View-bilde, vil Google plukke den nærmeste til å vise om det er innenfor en gitt avstand. Hvis ingen Street View er i nærheten (si du velger et sted i midten av havet), deretter Street View vil vise en svart skjerm.

Noe annet å være klar over er at du bare kan ha én StreetViewPanoramaView . eller fragment synlig for brukeren samtidig

for å starte, oppdatere view_map_overlay.xml for å legge til en StreetViewPanoramaView
. < com.google.android.gms.maps.StreetViewPanoramaView android : id = "+ id /steet_view_panorama" android: layout_width = "match_parent" android: layout_height = "240dp" android: layout_alignParentBottom = "true" />

Når layout filen er klar, gå inn onCreateView i MapFragment lagre en referanse til den nye visningen, og kaller onCreate metode for visningen. Det er viktig at du ringer onCreate, fordi den aktuelle fragmentet er onCreate har allerede blitt kalt før dette synet var festet, og Street View komponent utfører handlinger i onCreate som er nødvendige for initialisering.
Overridepublic Vis onCreateView (LayoutInflater inflater, ViewGroup container , Bundle savedInstanceState) {ViewGroup forelder = (ViewGroup) super.onCreateView (inflater, container, savedInstanceState); Vis overlegg = inflater.inflate (R.layout.view_map_overlay, foreldre, 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 (overlay); returnere forelder;}

Neste, i onViewCreated, legge til en ny metode som kalles initStreetView. Denne nye metoden vil asynkront få StreetViewPanorama objekt når den er klar og håndtak som viser din første Street View posisjon. Det er viktig å merke seg at getStreetViewPanoramaAsync (OnStreetViewPanoramaReadyCallback tilbakeringing) kan bare kalles fra hovedtråden
private void initStreetView () {GetMap () setOnMapLongClickListener (denne)..; mStreetViewPanoramaView.getStreetViewPanoramaAsync (ny OnStreetViewPanoramaReadyCallback () {Override public void onStreetViewPanoramaReady (StreetViewPanorama panorama) {mPanorama = panorama, showStreetView (ny LatLng (40,7506, -73,9936));}});}

Til slutt, må du definere showStreetView (LatLng LatLng) helper metoden vist ovenfor. Denne metoden skaper en StreetViewPanoramaCamera objekt som lar deg endre tilt, zoom, og lageret av Street View kameraet. For dette eksempelet, er kameraet satt til standardverdiene.

Deretter må du stille inn kameraposisjon. I dette eksempelet vi slår også på en valgfri innstilling for å vise gatenavn
private void showStreetView (LatLng LatLng) {if (mPanorama == null) avkastning.; StreetViewPanoramaCamera.Builder byggmester = ny StreetViewPanoramaCamera.Builder (mPanorama.getPanoramaCamera ()); builder.tilt (0.0f); builder.zoom (0.0f); builder.bearing (0.0f); mPanorama.animateTo (builder.build (), 0); mPanorama.setPosition (LatLng, 300); mPanorama.setStreetNamesEnabled (true);}

Når showStreetView (LatLng LatLng) metoden er fullført, kan det også bli kalt fra onMapLongClick (LatLng LatLng) slik at du kan enkelt endre hvilket område som blir vist
Overridepublic annullert. onMapLongClick (LatLng LatLng) {showStreetView (LatLng);}
Konklusjon

i denne opplæringen, lærte du om noen avanserte måter du kan samhandle med Google Maps ved å legge til flere visninger til MapFragment og du lærte å kontrollere innendørs bygningsnivå velgeren. Vi har også dekket grunnleggende for å legge Street View funksjonalitet til søknaden din for å vise en annen synsvinkel for brukerne.

I neste avdrag av denne serien, vil du lære om Google Maps Utilities bibliotek og hvordan å bruke den til å legge til markør klynger, varme kart og andre nyttige funksjoner for dine applikasjoner.



Previous:
Next Page: