Video: Car Quist-Møller i Den 3. Tango 2024
Android driver mange af Googles innovative projekter. Tag for eksempel tablet-enheden kendt som Project Tango. Ved første øjekast ser en Project Tango-enhed ud som en almindelig syv-tommers tablet. Når du tænder for enheden, kan du se den velkendte Android-startskærm med ikoner til lancering af apps og med indikatorer for WiFi-signal og batteristyrke.
Enheden kører selv Googles Play Butik-app, så du kan bruge den til at surfe på internettet, redigere dokumenter og gøre alle de andre ting, som almindelige tablet-enheder gør.
Men Project Tangos hardware er ikke almindelig. På bagsiden af tabletten er der en dybdesensor, et fiskekamera og et IR-kamera. Ved at kombinere data fra disse kilder med sin interne bevægelsessporingshardware, skaber Project Tango et 3D-kort over det omgivende rum.
Du kan lave et kort over din egen stue og gemme kortet på en Project Tango enhed. Når du bringer enheden tilbage til din stue, husker enheden pladsen og alle genstande inde i rummet.
Tango kommer med et par demo apps. Med en app målter du enheden på to punkter for at måle afstanden mellem disse punkter. Du kan stå flere meter fra start- og slutpunktet, fordi enheden ved, hvor langt du er fra hvert af punkterne.
Med en anden app går du gennem virtuelle verdener. For at ændre dit synspunkt i en verden, drejer du ikke et joystick, flytter en mus eller træk fingrene langs en skærm. I stedet ser du enhedens skærm, når du bevæger dig rundt i dit eget virkelige miljø. Enheden viser dig, hvad du vil se i den virtuelle verden, mens du går fremad, vend for at se sidelæns og navigere dig rundt virtuelle 3D-objekter.
For at komme i gang med at udvikle, kommer Project Tango med nogle prøveapps. Åbning af den meget grundlæggende QuickStart-app i Android Studio viser oversættelses- og rotationsværdier, når du flytter enheden fra sted til sted. (Se nedenstående figur.)
QuickStart-appen.Kernen i QuickStart-appen er en Android-aktivitet. Nogle af appens kode vises nedenfor.
/ * * Copyright 2014 Google Inc. Alle rettigheder forbeholdes. * * Licenseret under Apache License, Version 2. 0 ("License"); * Du må ikke bruge denne fil undtagen i overensstemmelse med Licensen. * Du kan få en kopi af licensen på * * // www. apache. org / licenser / LICENS-2. 0 * * Medmindre det kræves i henhold til gældende lovgivning eller aftalt skriftligt, distribueres software * distribueret under Licensen på en "AS IS" BASIS, * UDEN GARANTIER ELLER BETINGELSER AF ENHVER ART, enten udtrykkeligt eller underforstået.* Se Licensen for det specifikke sprog, der styrer tilladelser og * begrænsninger under Licensen. * / import com. google. ATryk. tangoservice. Tango; import com. google. ATryk. tangoservice. Tango. OnTangoUpdateListener; import com. google. ATryk. tangoservice. TangoConfig; import com. google. ATryk. tangoservice. TangoCoordinateFramePair; import com. google. ATryk. tangoservice. TangoPoseData; // Der er flere importdeklarationer her offentlig klasse MainActivity udvider Aktivitet {@Override protected void onCreate (Bundle savedInstanceState) {super. onCreate (savedInstanceState); setContentView (R. layout. activity_main); mTranslationTextView = (TextView) findViewById (R. id. translation_text_view); mRotationTextView = (TextView) findViewById (R. id. rotation_text_view); // Instantiate Tango klient mTango = ny Tango (dette); // Sæt Tango-konfiguration til bevægelsessporing mConfig = mTango. getConfig (TangoConfig. CONFIG_TYPE_CURRENT); mConfig. putBoolean (TangoConfig. KEY_BOOLEAN_MOTIONTRACKING, true);} @Override protected void onActivityResult (int requestCode, int resultCode, Intent data) {prøv {setTangoListeners ();} catch (TangoErrorException e) {} prøv {mTango. connect (mConfig);} catch (TangoOutOfDateException e) {} fange (TangoErrorException e) {}} private void setTangoListeners () {// Vælg koordinatrammerpar ArrayList framePairs = new ArrayList (); framePairs. tilføj (ny TangoCoordinateFramePair (TangoPoseData. COORDINATE_FRAME_START_OF_SERVICE, TangoPoseData. COORDINATE_FRAME_DEVICE)); // Tilføj en lytter til Tango pose data mTango. connectListener (framePairs, ny OnTangoUpdateListener () { @Override offentligt tomrum påPoseAvailable (TangoPoseData pose) { // Format Translation og Rotation data final String translationMsg = String. format (sTranslationFormat, pos. oversættelse [0], posere. oversættelse [1], sætte oversættelse [2]), slutstreng rotationMsg = Stringformat (sRotationFormat, posere rotation [0], [rotation] [3]); // Vis data i TextViews runOnUiThread (Ny Runnable () { @Override offentlig tomgang () { mTranslationTextView. setText (translationMsg); mRotationTextView.} } } } );}} Hvad du ser her, er ikke hele 210-linien MainActivity klasse, men nogle af klassens vigtige højdepunkter er opsummeret. Se på MainActivity-klassen. Hjertet af aktivitetens kode er inde i den anonyme OnTangoUpdateListener klasse med sin onPoseAvailable metode.
I hverdagen er en
pose
den måde du orienterer dit hoved i forhold til dine omgivelser. Og i Project Tango-terminologi er en pose den måde du orienterer enheden på i forhold til omgivelserne. Et pose er beskrevet af syv tal, ligesom de oversættelses- og rotationsnumre, som du ser i det foregående billede. Når enhedens hardware registrerer en ny pose, kalder softwaren onPoseAvailable-metoden. OnPoseAvailable-metoden skal vise meddelelser som Oversættelse: -2.6622, 3. 214773, 2. 824979 i aktivitetens tekstfelter. Men der er et problem. Android's trådløbsregler dikterer, at ingen andre tråd end hovedtråden kan opdatere en applikations brugergrænseflade. I MainActivity-klassen løber OnTangoUpdateListener-forekomsten i en tråd helt. Så kan instansens onPoseAvailable-metode ikke vise meddelelser i aktivitetens tekstfelter ved direkte at ringe til mTranslationTextView. setText og mRotationTextView. setText metoder.
Men som professor Farnsworth i
Futurama
siger altid, er der "Gode nyheder, alle! "Android har en runOnUiThread metode til bare sådanne lejligheder. RunOnUiThread-metoden er en klasse, der implementerer Java's Runnable-grænseflade. I QuickStart-appens kode viser denne kørselsmetode tekst på vegne af OnTangoUpdateListener-forekomsten. Til sidst ser enhedens bruger oversættelses- og rotationsdataene, og alt er godt.