Forhøyet og virtuell virkelighet, samtidig som den er relativt ny, har raskt blitt populær for apper, inkludert for spill og utdanning. Tidligere viste jeg deg hvordan du installerer Kartong ved hjelp av Android SDK og hvordan du lager en panoramabildvisningsbil. Dette innlegget viser deg hvordan du bruker 360 graders video i appene dine.
Før du begynner å bygge videoviseren din, må du klone kartong Android SDK på datamaskinen din via Git. Du finner instruksjoner for dette i forrige artikkel i denne serien.
For vårt eksempel, opprett et nytt Android-prosjekt med et minimum SDK av API 19 (KitKat) og bruk Tom aktivitet mal.
Når ditt grunnprosjekt er opprettet, må du kopiere felles, commonwidget og videowidget mapper fra Cardboard SDK til roten til prosjektet ditt. Når disse katalogene er flyttet over, må du inkludere dem som moduler i prosjektet ved å redigere settings.gradle filen for å se ut som følgende utdrag.
inkluderer ': app', 'common', 'commonwidget', 'videowidget'
Til slutt, ta med disse og andre nødvendige biblioteker i prosjektet ved å legge til følgende linjer i ditt app modulens build.gradle fil under avhengig node.
avhengigheter compile 'com.android.support:appcompat-v7:25.0.0' kompilere prosjekt (': common') kompilere prosjekt (': commonwidget') kompilere prosjekt (': videowidget') kompilere 'com.google.android. exoplayer: exoplayer: r1.5.10 'compile' com.google.protobuf.nano: protobuf-javanano: 3.0.0-alfa-7 '
Du vil legge merke til at vi har lagt til protokollbufferbiblioteket fra Google, som hjelper med å administrere runtime-ressurser på enheten, og ExoPlayer, som er et Google-opprettet videospillerbibliotek som VrVideoView
komponenten er bygget på. Begge disse bibliotene kreves av Cardboard SDK for å fungere, og du har kanskje lagt merke til at ExoPlayer-versjonen som er brukt fra den første utgivelsen, ikke den andre, kan føre til konflikter hvis du bruker ExoPlayer v2 i dine egne prosjekter.
Deretter vil vi oppdatere vår activity_main.xml fil for vårt utvalgsprosjekt å inkludere a VrVideoView
, en seekbar
, og a Knapp
at vi vil jobbe med senere.
Når du er ferdig med å sette opp kartongbiblioteker og har opprettet layoutet vi skal bruke, er det på tide å hoppe inn i Java-koden.
Før vi kan begynne å skrive all koden som styrer avspillingsstatus, posisjon og lasting i 360 videofilen, må vi finne kilden til videoen vår. For denne opplæringen vil vi bare lage en eiendeler mappe under hovedkatalogen, og legg en 360-video der. Mens det er noen kilder til 360 videoer på nettet, har jeg tatt med en kort offentlig domene video fra Sea World, som returnerer en havskildpadde til havet i det medfølgende GitHub-prosjektet for denne opplæringen.
Nå som du har en videofil å spille, åpner du Hoved aktivitet
klasse.
Du må først deklarere og initialisere Utsikt
elementer som er definert av layoutfilen, samt to boolean
verdier for å holde oversikt over dempet og spille / pause tilstand. I tillegg vil vi plassere en OnClickListener
på volumet vårt Knapp
gjenstand.
offentlig klasse MainActivity utvider AppCompatActivity private VrVideoView mVrVideoView; privat SeekBar mSeekBar; privat knapp mVolumeButton; private boolske mIsPaused; private boolske mIsMuted; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); initViews (); private void initViews () mVrVideoView = (VrVideoView) findViewById (R.id.video_view); mSeekBar = (SeekBar) findViewById (R.id.seek_bar); mVolumeButton = (Button) findViewById (R.id.btn_volume); mVolumeButton.setOnClickListener (ny View.OnClickListener () @Override public void onClick (View view) onVolumeToggleClicked ();); offentlig ugyldig playPause () offentlig tomgang påVolumeToggleClicked ()
Deretter oppretter du en ny indre klasse som strekker seg VrVideoEventListener
. Denne klassen vil ha fem metoder som vi kan implementere for vår enkle videoviser.
privat klasse ActivityEventListener utvider VrVideoEventListener @Override public void onLoadSuccess () super.onLoadSuccess (); @Override public void onLoadError (String errorMessage) super.onLoadError (errorMessage); @Override public void onClick () super.onClick (); @Override public void onNewFrame () super.onNewFrame (); @Override public void onCompletion () super.onCompletion ();
Du må også implementere SeekBar.OnSeekBarChangeListener
i klassen din og opprett metoden stubber for det grensesnittet.
offentlig klasse MainActivity utvider AppCompatActivity implementerer SeekBar.OnSeekBarChangeListener ... offentlig ugyldig påPlayPausePressed () offentlig ugyldig påVolumeToggleClicked () @Override public void onProgressChanged (SeekBar seekBar, int jeg, boolsk b)
Når du har opprettet denne nye indre klassen og seekbar
implementere, knytte dem til din VrVideoView
og seekbar
, henholdsvis på slutten av initViews ()
metode som ble definert ovenfor.
mVrVideoView.setEventListener (ny ActivityEventListener ()); mSeekBar.setOnSeekBarChangeListener (this);
Det er en ekstra oppsett som må tas vare på. Du må håndtere Android-aktivitetens livssyklus ved å støtte onPause ()
, onResume ()
og onDestroy ()
metoder for å stoppe eller gjenoppta gjengivelse i VrVideoView
, eller å lukke den helt ned. Du må også holde oversikt over pause tilstanden i disse metodene.
@Override protected void onPause () super.onPause (); mVrVideoView.pauseRendering (); mIsPaused = true; @Override protected void onResume () super.onResume (); mVrVideoView.resumeRendering (); mIsPaused = false; @Override protected void onDestroy () mVrVideoView.shutdown (); super.onDestroy ();
Nå som det første oppsettet av vår opplærings klasse er fullført, kan vi gå videre til det mer interessante emnet: laste inn en video, kontrollere avspilling og tilpasse brukeropplevelsen.
VrVideoView
Fordi lasting av en 360-video kan ta alt fra en brøkdel av et sekund til flere sekunder, vil du ønske å håndtere å laste videoen din gjennom en bakgrunnsoppgave. La oss begynne med å opprette en ny AsyncTask
som vil skape en ny VrVideoView.Options
objekt, angi inngangstypen for å matche videoens formatering (i tilfelle denne opplæringen, TYPE_MONO
), og last deretter inn videoen vår fra eiendeler katalog.
klasse VideoLoaderTask utvider AsyncTask@Override protected Boolean doInBackground (void ... voids) prøv VrVideoView.Options options = ny VrVideoView.Options (); options.inputType = VrVideoView.Options.TYPE_MONO; mVrVideoView.loadVideoFromAsset ("seaturtle.mp4", alternativer); fangst (IOException e) // Håndtak unntak returnere true;
Deretter går du inn i din onCreate ()
metode og opprett en ny forekomst av denne oppgaven, og ring deretter henrette()
å starte den. Mens det er noe mer som bør gjøres for å opprettholde denne oppgaven, vil vi bare bruke den lokalt i denne metoden for enkelhet og ikke bekymre deg for AsyncTask
livssyklus hensyn.
VideoLoaderTask mBackgroundVideoLoaderTask = ny VideoLoaderTask (); mBackgroundVideoLoaderTask.execute ();
På dette tidspunktet bør du være i stand til å kjøre programmet og se 360-videoavspillingen i kartbrettet. Nå som det fungerer, la oss legge til noe verktøy for brukeren vår. Gå tilbake til ActivityEventListener
objekt som du opprettet tidligere i denne opplæringen, da vi vil kaste ut noen av metodene. Når videoen er lastet inn, må vi sette maksverdien for vår seekbar
, samt holde orden på spill / pause tilstanden til videoen vår.
@Override public void onLoadSuccess () super.onLoadSuccess (); mSeekBar.setMax ((int) mVrVideoView.getDuration ()); mIsPaused = false;
Når videoen spilles, oppdaterer vi det seekbar
gjennom onNewFrame ()
, og tilbakestill videoen til den opprinnelige posisjonen i onCompletion ()
. Til slutt, i ved trykk()
, vi vil utløse vår avspilling / pause vekselsmetode.
@Override public void onClick () playPause (); @Override public void onNewFrame () super.onNewFrame (); mSeekBar.setProgress ((int) mVrVideoView.getCurrentPosition ()); @Override public void onCompletion () // Start videoen, slik at den kan sløyfe mVrVideoView.seekTo (0);
Mens du oppdaterer vår seekbar
basert på avspilling er viktig, vil vi også tillate brukeren å endre hvor de er i videoen ved å samhandle med seekbar
. Vi kan gjøre dette ved hjelp av SeekBar.OnSeekBarChangeListener
grensesnitt som vi implementerte tidligere.
@Override public void onProgressChanged (SeekBar seekBar, int fremgang, boolean fromUser) if (fromUser) mVrVideoView.seekTo (fremgang);
Å avrunde vår VrVideoView
kontroller, må vi implementere spill / pause og volum veksle metoder.
public void playPause () if (mIsPaused) mVrVideoView.playVideo (); ellers mVrVideoView.pauseVideo (); mIsPaused =! mIsPaused; offentlig ugyldig påVolumeToggleClicked () mIsMuted =! mIsMuted; mVrVideoView.setVolume (mIsMuted? 0.0f: 1.0f);
På dette tidspunktet bør du ha en fullt fungerende og interaktiv 360 videospiller som arbeider i appen din.
Men hvis du roterer enheten, kan du merke at uønsket oppførsel av videoen starter helt på nytt. Vi kan fikse dette ved å jobbe med Android onSaveInstanceState ()
og onRestoreInstanceState ()
å lagre og tilbakestille tilstanden til vår VrVideoView
.
privat statisk sluttstreng STATE_PROGRESS = "state_progress"; privat statisk sluttstreng STATE_DURATION = "state_duration"; @Override protected void onSaveInstanceState (Bundle outState) outState.putLong (STATE_PROGRESS, mVrVideoView.getCurrentPosition ()); outState.putLong (STATE_DURATION, mVrVideoView.getDuration ()); super.onSaveInstanceState (outState); @Override protected void onRestoreInstanceState (Bundle savedInstanceState) super.onRestoreInstanceState (savedInstanceState); lang fremgang = savedInstanceState.getLong (STATE_PROGRESS); mVrVideoView.seekTo (fremgang); mSeekBar.setMax ((int) savedInstanceState.getLong (STATE_DURATION)); mSeekBar.setProgress ((int) fremgang);
Nå, når enheten er rotert, skal videoen gå tilbake til sin opprinnelige posisjon, og brukeren kan fortsette med sin uavbrutt erfaring.
Selv om det er noen få små detaljer som må håndteres for å bruke Cardboard SDKs VrVideoView, håndteres de vanskelige delene, for eksempel faktisk avspilling og optimalisering, av en komponent som er enkel å implementere.
Du bør nå kunne legge til 360 videoer i medieappene dine, og gi brukerne en interessant funksjon som beriker deres erfaring. I neste veiledning i denne serien vil vi fokusere på Googles nye VR-opplevelse, kalt Daydream, og hvordan du bruker den parrede kontrolleren med appene dine.
I mellomtiden kan du sjekke ut noen av våre andre opplæringsprogrammer på Android virtual reality og forstørret virkelighet!