Bygg en GPS Speedometer: Brukergrensesnitt og Polish

Build en GPS Speedometer: Brukergrensesnitt og polsk
Del
Del
Del
Del

Denne Cyber ​​Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

I løpet av den første delen på Mobiletuts +, dekket vi grunnleggende AIR for Android utvikling og også fått på plass det grunnleggende for vår speedometer app ved hjelp av GPS-støtte for å bestemme vår nåværende hastighet.

Nå skal vi legge den siste finpussen til app ved å bygge sitt brukergrensesnitt, og også legge koden for å tillate appen å opprettholde sin status.

Sjekk ut første del av denne opplæringen Bygg en GPS Speedometer: Komme inn AIR for Android over på vår søsterside Mobiletuts +




Trinn 1: Working FLA

Launch Flash Professional CS5 og åpne FLA du var jobbe med fra Part 1.

kunstverk som kreves for denne opplæringen ble gitt i del 1 i kilde /speedometer-artwork.fla
, som ble brukt som utgangspunkt. Arbeids FLA bør derfor inneholde de samme kunstverk i sitt bibliotek

Bekreft dette ved å sjekke at FLA bibliotek ser slik ut:.

Hvis biblioteket ikke inneholder skisser deretter kopiere den fra kilde /speedometer-artwork.fla
, som ble gitt i del 1.



Trinn 2: Speedometer UI

Foreløpig UI består av to dynamiske tekstfelt - ett som viser din nåværende hastighet i meter per sekund, den andre i miles per time

Bruk av kunstverk fra biblioteket la oss nå lage et speedometer ring som vi kan bruke til å erstatte disse tekstfeltene
<.. p> Velg Sett inn | New Symbol ... (Ctrl + F8)

Innenfor Opprett ny Symbol panel, navngi symbolet 'Speedometer "og sikre at denne typen er satt til' Movie Clip ':.

Klikk OK

Fra Flash IDE kan du nå direkte redigere filmklipp som du har laget

navn din tidslinje lag "Meter Bakgrunn ':..

Innen biblioteket, utvide 'Bakgrunn' mappen og dra 'meter background.png "til scenen

Fra Properties Inspector panel, sette klippets x og y-verdier til" 0 ".


< h2> Trinn 3: Legge til Needle

Bor innen tidslinjen for 'Speedometer', legger et nytt lag og gi den navnet "Arrow":

Innen biblioteket, utvide "Arrow" -mappen og dra den "Arrow" filmklipp på scenen. Sørg for at du drar den ut mot lag som heter "Arrow".

Fra Properties Inspector panel, sette klippets x-verdien til 239 og sin y-verdien til 273.

navn forekomsten 'pil' innenfor Eiendom Inspector panel.

Med klippet fortsatt markert, velger Free Transform Tool (Q) fra Verktøy-bar. En markeringsramme vises rundt klippet med utgangspunktet vises som en hvit sirkel i midten:

Flytt klippets utgangspunktet til bunnen-senter på markeringsrammen:

flytte tilbake til roten tidslinje



Trinn 4:.. Skifte Midlertidig UI

Vi kan nå fjerne tekstfeltene som tidligere representerte UI

Klikk på den Selection Tool (V) fra Verktøy-bar og individuelt velge og slette hver av tekstfeltene fra scenen.

Også fjerne eventuelle innebygde skrifter i biblioteket som kan ha vært forbundet med tekstfeltene.

Dra fra biblioteket til scenen, den "Speedometer 'filmklipp du opprettet i trinn 3. Navn klippets eksempel" speedometer "og plasser den på (0, 81).

Endre navn på tidslinjen lag som klippet er å sitte på å "Speedometer '

root tidslinje etappe skal nå se slik ut:.

Lagre FLA



Trinn 5.: Oppdatere Document Class

Vi trenger også å gjenspeile disse endringene i dokumentet klassen

Åpne Application.as og ta ut følgende to medlems variabeldeklarasjoner:
offentlig Var metresPerSecond. Textfield; offentlig Var milesPerHour: Textfield;

Du må også fjerne referanser til disse variablene fra handleGeolocationUpdate () -metoden. Fjern de følgende to linjer:
privat funksjon handleGeolocationUpdate (e: GeolocationEvent): void {metresPerSecond.text = String (Math.round (e.speed)); milesPerHour.text = String (Math.round (convertToMilesPerHour (e.speed)));}

Du kan også fjerne import uttalelsen brukes for tekstfeltene:
import flash.events.KeyboardEvent; import flash.text .TextField, import flash.ui.Keyboard;

Til slutt legger du til et nytt medlem variabel som refererer den nye speedometer filmklipp eksempel som sitter på scenen:
offentlig Var speedometer: Speedometer, private Var geolocation: IGeolocation; < . p> Lagre Application.as

Vi vil komme tilbake til Application.as når vi har skrevet en klasse som representerer speedometer



Trinn 6:. Speedometer Class

Opprett en ny klasse og legg følgende til det:
pakke {import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; public class Speedometer strekker Sprite {/* konstanter * /statisk privat konst SPEED_CONVERSION_BASE: Number = 2,2369362920544; statisk privat konst ROTATION_CONVERSION_BASE: Number = 1,671428571; statisk privat konst START_ROTATION: Number = -117 /* Medlem variabler * /public Var pil: MovieClip; /* Klasse Metoder * /public funksjon Speedometer () {addEventListener (Event.ADDED_TO_STAGE, handleAddedToStage); } Offentlig funksjon innstilt hastighet (metresPerSecond: Number): void {var milesPerHour: Number = convertToMilesPerHour (metresPerSecond); arrow.rotation = convertToRotation (milesPerHour); } Private funksjon handleAddedToStage (e: Hendelses): void {removeEventListener (Event.ADDED_TO_STAGE, handleAddedToStage); arrow.rotation = START_ROTATION; } Private funksjon convertToRotation (milesPerHour): Antall {return START_ROTATION + (milesPerHour * ROTATION_CONVERSION_BASE); } Private funksjon convertToMilesPerHour (metresPerSecond: Number): Antall {return metresPerSecond * SPEED_CONVERSION_BASE; }}}

Lagre klassen som Speedometer.as.

Flytt til biblioteket og høyreklikk på Speedometer klippet og velger Egenskaper ...
. Innenfor Symbol Properties panel, utvide "Avansert" -delen. Klikk på "Export for Action 'boksen og sette Class-feltet til' Speedometer ':

Klikk på OK for å begå endringene. Den Speedometer klassen vil nå være knyttet til Speedometer filmklipp i biblioteket.

Klassen har ett medlem variabel kalt pilen, som har en referanse til filmklipp eksempel som representerer speedometer sin nål.
< p> handleAddedToStage () metoden blir kalt når speedometeret er ADDED_TO_STAGE hendelsen utløses. I øyeblikket er metoden bare roterer pilen filmklipp eksempel slik at det er i utgangspunktet peker på 0 miles per time på speedometeret.

Speedometer klasse offentlige API består av en enkelt eiendom som heter fart, som aksepterer en hastighet målt i meter pr sekund. Du kan se den metoden som håndterer dette her:
offentlig funksjon innstilt hastighet (metresPerSecond: Number): void {var milesPerHour: Number = convertToMilesPerHour (metresPerSecond); arrow.rotation = convertToRotation (milesPerHour);}

I hovedsak, konverterer fremgangsmåte hastigheten fra meter per sekund i miles pr time før beregning av rotasjonsvinkelen som skal anvendes på nålen for å gjøre den peker til den korrekte stilling på speedometeret. Klassen har også to private metoder som hjelper den å gjøre dette - convertToMilesPerHour () og convertToRotation ()



Trinn 7:.. Oppdatere Speedometer

La oss gå tilbake til Application.as

Legg til følgende linje med kode til handleGeolocationUpdate () metode:
privat funksjon handleGeolocationUpdate (e: GeolocationEvent): void {speedometer.speed = e.speed;}

Dette vil tvinge speedometer til oppdatere hver gang nye GPS-data er tilgjengelig

Lagre Application.as



Trinn 8:.. Testing Vi har følgende

Ok nå er vi i en posisjon å teste det vi har for øyeblikket.

Hvis du tester direkte på en Android-enhet og stole på sin GPS-enhet og velg deretter "Ekte" publisere profil som vi satt opp i del 1, og også huske å aktivere GPS sensor. Hvis du tester på skrivebordet eller på en Android-enhet uten å stole på sin GPS-enhet og velg deretter "Simulate" publisere profil

Hvis du tester innen Flash Professional velger du Control. | Test Movie | i Flash Professional. Hvis du tester på en Android-enhet velger du Fil | Publish (Alt + Shift + F12)

Også, hvis du bygger en AIR for Android app for første gang i dag vil du bli presentert med Application &.; Installer innstillingspanelet når du forsøker å publisere:

Du må taste inn passordet du tilknyttet sertifikatet fra Part 1. Velg også "Husk passord for denne økten" boksen for å forhindre dette panelet vises hver gang du forsøker å publisere og distribuere til din Android-telefon.

Vi er absolutt et skritt nærmere, men det er ting som fortsatt må tas opp. Trolig den mest åpenbare er at speedometer er nålen ikke jevnt reise mellom hastigheter. I stedet hopper til hvert mål hastighet ved mottak oppdaterte data fra enhetens GPS-enheten. Dernest, ikke speedometer ikke har en fungerende kjørelengde teller.

Vi skal fikse begge disse problemene snart, men først la oss se på noen optimalisering teknikker som vil gagne apps som kjører på mobilen.


< h2> Trinn 9: Forbedre resultater på Mobile

Når man utvikler for mobil, optimalisering og ytelse bør være en viktig faktor. Det er et par ting vi kan gjøre for Speedometer klassen til hjelp ytelse på mobil

Legg til følgende to linjer med kode til handleAddedToStage () metode innen Speedometer.as.
Privat funksjon handleAddedToStage (e : Hendelses): void {removeEventListener (Event.ADDED_TO_STAGE, handleAddedToStage); mouseEnabled = false; mouseChildren = false; arrow.rotation = START_ROTATION;.}

Siden det ikke er nødvendig, deaktiver vi mus samhandling innenfor speedometeret ved å sette både mouseEnabled og mouseChildren egenskaper til falsk

Dette er god praksis når du skriver mobile applikasjoner og selv om det ikke vil gi noen synlig fordel i en app så trivielt som denne, kan gevinsten være betydelig i prosjekter som har dypt nestede visningslister hvor hendelsen boblende kan forårsake ytelsesproblemer.

Bor i handleAddedToStage ( ) -metoden legge til følgende to linjer med kode:
privat funksjon handleAddedToStage (e: Hendelses): void {removeEventListener (Event.ADDED_TO_STAGE, handleAddedToStage); mouseEnabled = false; mouseChildren = false; arrow.cacheAsBitmap = true; arrow.cacheAsBitmapMatrix = new Matrix (); arrow.rotation = START_ROTATION;}

Igjen primært hjelp ytelse på mobile enheter, vi også cache nålen sin filmklipp på enhetens GPU med både cacheAsBitmap og cacheAsBitmapMatrix egenskaper

GPU caching tvinger en bitmap versjon. av en skjerm objekt som skal sendes til enhetens graphics processing unit der det kan bli trukket til skjermen mye raskere.

Ved å sette en skjerm objektets cacheAsBitmap eiendom til sann du oppgi til Flash runtime at du ønsker en bitmap representasjon av det objekt som skal lagres på GPU. Den bitmap vil holde seg på GPU til displayet objektet det representerer endringer, hvorpå en ny bitmap er opprettet for skjermobjekt og sendt til GPU.

For GPU caching å være effektive du trenger å minimere antall av ganger din skjerm objektet endres. Endre objektets x eller y posisjon er greit siden de lagrede bitmap data kan fortsatt brukes, men flytter spillehodet innenfor skjermen objekt eller rotere det vil oppheve den bufrede versjonen, og tvinger en ny bitmap å bli gjengitt og lastet opp til GPU. Denne prosessen er dyre og har visningsobjekter som kontinuerlig må re-bufret faktisk vil hemme ytelsen heller enn å forbedre den.

Med tanke på speedometeret sin nål stadig blir rotert spør du kanskje hvorfor vi bry caching det. Tross alt, ikke det tvinge pilen filmklipp å være konstant re-bufret? Det korte svaret er ja hvis vi bare hadde satt den cacheAsBitmap eiendom til sann. Men en ekstra eiendom - cacheAsBitmapMatrix - ble også innstilt. Dette hotellet tillater flere grafiske operasjoner som skal utføres på GPU som rotasjon.

I andre ord, ved å sette både cacheAsBitmap og cacheAsBitmapMatrix kan du tvinge et bitmap representasjon av vårt speedometer er nål for å bli lastet opp til GPU og også har GPU rotere at bufret bitmap hver gang nålen roteres ved vår kode

Til slutt legger du til følgende import uttalelse til din klasse.
import flash.events.Event; import flash.geom.Matrix;.

GPU caching er en kraftfull teknikk og gir betydelige ytelsesfordeler løpet bitmap caching, men det må brukes med forsiktighet - det er ikke ideelt for alt, og feil bruk kan lamme appen

Forestillingen gevinster er ikke sannsynlig å bli sett i dette programmet, men denne lille introduksjon til GPU caching bør komme til nytte i mange av dine fremtidige mobilprosjekter.

Lagre Speedometer.as.



Trinn 10: Stille GPU Render Mode

Adobe AIR for Android gir to gjengi moduser som kan brukes ved kjøring. Hittil har vi brukt CPU gjengi modus, noe som tvinger alle grafikkgjengivelse skal finne sted på CPU. For å dra nytte av på enheten GPU må du spesielt satt appen til å bruke GPU gjengi modus

La oss gjøre det nå

Innenfor Flash IDE velge Fil.. | AIR Android Innstillinger ... for å få opp Application & Installer innstillingspanelet:

Pass på at kategorien Generelt er valgt. Bruke rullegardinmenyen, sette 'Render mode' feltet til "GPU".

Nå Klikk OK.

Ved hjelp profil 'Simulate ", publisere og distribuere denne nyeste versjonen på din . Android-enhet



Trinn 11: Håndtere feil i GPS-data

Du husker kanskje fra del 1 at GPS-mottakere er ikke alltid nøyaktig betyr at dataene du mottar fra telefonens Sensoren kan ikke alltid være korrekt. Selv testdata jeg gitt for GeolocationSimulate klassen inneholdt feil.

Det bør forventes at de data som kommer fra GPS-mottakeren kan noen ganger være feil og du bør skrive kode for å håndtere dette, spesielt pigger som kan gjøre din applikasjonen oppfører seg på en merkelig måte

Her er verdiene for de første femten sekundene av data utgang fra GeolocationSimulate.

2, 128, 5, 6, 128, 7, 128, 7, 128, 8, 6, 5, 128, 7, 9

Som du ser er det flere rare glitches som forårsaker mottakeren for å rapportere at du reiser på 128 meter per sekund. Vi ønsker å fange disse toppene og hindre dem viser i speedometer app.

Vi tar en noe forenklet tilnærming innenfor vår app. Vi skal prøve å begrense toppene ved å sette en øvre grense for økningen i meter per sekund på at vi kan reise på. Noe høyere enn denne verdien vil bli ignorert

Først innen Speedometer.as, legge til følgende konstant:
statisk privat konst START_ROTATION: Number = -117static privat konst MAX_SPEED_INCREASE. Number = 20;

Vi trenger også et medlem variabel å huske den hastigheten du kjører i. Legg til følgende linje i klassen:
offentlig Var pil: MovieClip; private Var currMetresPerSecond: Number;

La oss initial som medlem variabel i konstruktøren:
offentlig funksjon Speedometer () {currMetresPerSecond = 0; addEventListener (Event.ADDED_TO_STAGE, handleAddedToStage);}

Nå er alt som gjenstår å gjøre er å legge noen kode for å avgjøre om du vil bruke den nyeste hastighet eller å fortsette å bruke den tidligere innspilt hastighet hvis den nyeste fart anses ugyldig. Legg til følgende linjer:
offentlig funksjon innstilt hastighet (metresPerSecond: Number): void {//Hindre geolocation feil fra å bli brukt. if (Math.abs (currMetresPerSecond - metresPerSecond) < MAX_SPEED_INCREASE) {currMetresPerSecond = metresPerSecond; } Var milesPerHour: Number = convertToMilesPerHour (currMetresPerSecond); arrow.rotation = convertToRotation (milesPerHour);}

Merk også at vi har endret følgende linje innen metoden fra:
Var milesPerHour: Number = convertToMilesPerHour (metresPerSecond);

til:
Var milesPerHour. Number = convertToMilesPerHour (currMetresPerSecond);

Lagre Speedometer.as

Det har tatt seg av eventuelle feilaktige data. Nå kan du bygge og teste den nyeste versjonen av appen. Du bør legge merke til at nålen ikke lenger hopper når data piggene er oppstått



Trinn 12:. Animere Needle

Som nevnt tidligere, hopper speedometeret er nål til verdier i stedet for jevnt .. flytte mellom dem

La oss rette på dette ved hjelp GreenSock sin TweenLite tweening motor

Legg til følgende import til Speedometer Klasse:
import flash.geom.Matrix, import com.greensock. TweenLite;

Nå innen innstilt hastighet () metoden erstatte følgende linje:
arrow.rotation = convertToRotation (milesPerHour);

med dette:
TweenLite.to (pil, en, {rotasjon: convertToRotation (milesPerHour)});

Denne nye kodelinje initierer en animasjon på pilen filmklipp eksempel som finner sted over en periode på ett sekund. I løpet av den perioden, pilen eksempel rotasjon eiendoms jevnt overganger fra sin nåværende verdi til den nye verdien beregnes ved convertToRotation ().

Lagre Speedometer.as.

Selvfølgelig må vi faktisk laste ned TweenLite SDK og sette opp Flash Professional CS5 til å bruke den. La oss gjøre det i neste trinn



Trinn 13:. Installere Greensock Tweenlite

Åpne en nettleser og gå til TweenLite side på GreenSock site: http: //www. greensock.com/tweenlite/

På høyre side av siden er en "Last ned AS3" -knappen. Klikk på den og laste ned zip-fil. Når lastet ned, kopiere zip-filen til skrivebordet ditt

For desktop, her hvor du skal kopiere zip-filen til.

  • Windows Vista og Windows 7: C: \\ Users \\ < em> brukernavnet_ditt
    \\ Desktop

    Windows XP: C: \\ Documents and Settings \\ brukernavnet_ditt
    \\ Desktop

    Mac OS X: Macintosh HD /Users / brukernavnet_ditt Twitter /Desktop

    Pakk ut alle filene og slette den opprinnelige zip-filen

    Innen Flash Professional CS5 velge Fil. | Publish Settings ....

    Innenfor Publish Settings panel velg "Simulate" publisere profil og velg "Flash" tab:

    Klikk på knappen Innstillinger ... helt til høyre av Script feltet. Den avanserte Actionscript 3.0 innstillingspanelet vises. Forsikre deg om at 'Kilde banen kategorien er valgt:

    Klikk på "Legg til New Path' knappen innenfor" Source path 'ruten (Pluss-knappen). Nå klikker du på "Bla til Path 'knappen.

    Bla til greensock-AS3
    mappen som inneholder sub-mappe som heter' no '. Hvis du pakket ut zip-filen til skrivebordet og banen skal være:

    Windows Vista og Windows 7: C: \\ Users \\ brukernavnet_ditt
    \\ Desktop \\ greensock-AS3 \\ greensock -as3 \\

    Windows XP: C: \\ Documents and Settings \\ brukernavnet_ditt
    \\ Desktop \\ greensock-AS3 \\ greensock-AS3 \\

    Mac OS X: Macintosh HD /Brukere / brukernavnet_ditt Twitter /Desktop /greensock-AS3 /greensock-AS3 /

    Hvis vellykket din Avansert Actionscript 3.0 innstillingspanelet skal se omtrent slik ut:

    Klikk OK å begå endringene.

    Nå endres til "Ekte" publisere profil og legge biblioteket vei til sin Actionscript 3.0 Innstillinger også.

    Pass på at begge profilene lykkes bygge.
    < p> Velg riktig profil og teste din siste versjonen av koden enten på skrivebordet eller på en enhet.

    Speedometeret er nålen skal nå flytte jevnt til målet hastighet.

    Du kan finne API Dokumentasjon for TweenLite og GreenSock øvrige tweening motorer på http://www.greensock.com/as/docs/tween/. Du kan også finne interaktive eksempler og eksempelkode for TweenLite på http://www.greensock.com/timelinelite/



    Trinn 14:. Starte Kilometerteller

    Vi er nå i posisjon til å starte arbeidet med speedometeret kjørelengde teller. Vår app vil spore den totale distansen du har reist og vil oppdatere kilometertelleren for å reflektere dette. Her er hvordan kjørelengde telleren vil se:

    Vi ønsker sifrene i skranken til jevnt rulle mellom verdier. For å se dette i aksjon ta en titt på forhåndsvisnings SWF vist i starten av denne opplæringen. Hver gang en ekstra mil er krittet opp vil du se tallene i telleren farten.

    Vår disken består av åtte sifre, og vi vil starte med å skrive en klasse som representerer et ensifret.



    Trinn 15: Digit Movie Clip

    Hvis du vil spare deg for den innsatsen du vil finne et filmklipp i biblioteket ditt som heter "Digit". Du finner det innenfor "Counter-mappen. Dobbeltklikk "Digit" for å flytte inn i sin tidslinje.

    Sitter på tidslinjen er et filmklipp eksempel heter 'kolonne'. Denne filmsnutten inneholder de enkelte punktgrafikk som representerer hvert av numrene som brukes av siffer. Bare én av disse tallene vil etter hvert være synlig til enhver tid via en maske

    Det kan i utgangspunktet virke merkelig, men kolonnen faktisk inneholder hvert nummer to ganger -. 0 til 9 og 0 til 9 igjen. Dette duplisering tillater oss å effektivt simulere sifret rulle rundt, for eksempel fra 9 til 0.

    I diagrammet nedenfor skal illustrere dette sammen med et par andre scenarier:

    I diagrammet ovenfor, den røde firkanten representerer området av "Digit" filmklipp som faktisk vil være synlig for brukeren. For å vise brukeren et annet nummer, den 'kolonne' eksempel vil bli rullet oppover -. Masken området vil alltid forbli på samme sted

    Det første eksemplet ovenfor viser en bevegelse fra tallet "0" til 4-tallet. Som du kan se, bruker vi bare den øverste halvdelen av kolonnen for dette - vi aldri flytte til de gjentatte tallene i den nederste halvdelen. Det samme gjelder også for det andre eksemplet hvor vi beveger oss fra antall '5' til antall "9".

    Det tredje eksemplet er imidlertid annerledes. Det viser sifret flytte fra antall '5' til antall '3'. Denne gang vi beveger oss fra tallene i den øvre halvdel av kolonnen til de like tall i den nedre halvdel av kolonnen. Det samme gjelder også for den siste eksempel, hvor vi beveger oss fra tallet "9" til antall "0".

    I hovedsak flytter fra et lavere tall til et høyere tall vil alltid foregå helt innenfor øvre halvdel av kolonnen. Men for å gi illusjon av å rulle tilbake rundt fra et høyere tall til et lavere tall må vi alltid flytte fra den øvre halvdel av kolonnen til en av de dupliserte tallene i nederste halvdel.



    Trinn 16: The Digit Class

    La oss faktisk skrive den klassen som er forbundet med og styrer 'Digit' filmklipp

    Opprett en ny klasse og legg følgende til det.
    pakke {import flash.display.MovieClip; import flash.events.Event; import flash.geom.Rectangle; import com.greensock.TweenLite; import com.greensock.easing.Linear; public class Digit strekker MovieClip {statisk privat konst DIGIT_HEIGHT: uint = 25; statisk privat konst DIGIT_WIDTH: uint = 23; offentlig Var kolonne: MovieClip; private Var currval: int; private Var PREVVAL: int; offentlig funksjon Digit () {currval = 1; PREVVAL = 1; scrollRect = new rektangel (0, 0, DIGIT_WIDTH, DIGIT_HEIGHT); } Offentlig funksjon innstilt verdi (verdi: int): void {//Sett sifret verdi. PREVVAL = currval; currval = verdi% 10; //Hvis det er første gang så snapper til verdien. //Ellers flytte til verdien. if (PREVVAL == -1) {snapColumn (); } Else {moveColumn (); }} Offentlig funksjon får valuta (): int {return currval; } Private funksjon snapColumn (): void {column.y = -currVal * DIGIT_HEIGHT; } Private funksjon moveColumn (): void {//Stopp kolonne fra animere. TweenLite.killTweensOf (kolonne); //Sikre at vi starter fra øvre halvdel av kolonnen. if (column.y < - (DIGIT_HEIGHT * 10)) {column.y + = (DIGIT_HEIGHT * 10); } //Finn ut hvor mange vi er i dag stoppet på. Var valStoppedAt: int = Math.abs (column.y /DIGIT_HEIGHT); //Beregn y-posisjon kolonnen må flyttes til å //vise den nye dagens antall. Var targY: Number = -currVal * DIGIT_HEIGHT; //Hvis den nye nåværende verdien er mindre enn verdien vi stoppet på //da må vi simulere sifret innpakning tilbake rundt. For å gjøre //dette, vil vi rulle inn i bunnen halvparten av kolonnen. if (currval < valStoppedAt) {targY - = (DIGIT_HEIGHT * 10); } //Utfør selve rulle animasjon på kolonnen. Var varighet: uint = Math.abs (column.y - targY) /DIGIT_HEIGHT; TweenLite.to (kolonne, varighet, {y: targY, letthet: Linear.easeNone}); }}}

    Lagre klassen som Digit.as.

    Digit klasse offentlige API består av en enkelt eiendom som heter verdi. Ved å sette denne egenskapen, vil sifret bla til den verdien. Det er ett unntak fra dette likevel. Hvis verdien eiendommen blir satt for første gang da klassen vil bare plassere siffer om denne verdien i stedet for å bla til det. Dette gjør at sifret å bli satt i en innledende standardposisjon første gang sin verdi eiendommen ligger.

    Ta en titt på import uttalelser i klassen. Du vil se at denne klassen, som Speedometer klassen, utnyttet TweenLite API:
    import com.greensock.TweenLite, import com.greensock.easing.Linear;

    Men så vel som å bruke TweenLite klasse vi også importere en av de TweenLite lettelser klasser navngitte Linear, som vil bli brukt til å definere hvordan kolonne med tall innenfor "Digit" filmklipp er tweened

    Tre medlem variabler brukes innen Digit.as.:
    offentlig Var kolonne: MovieClip; private Var currval: int; private Var PREVVAL: int;

    Den første - Kolonnen - rett og slett har en referanse eksempel kolonnen som sitter på den "Digit" filmklipp tidslinje til. De andre to medlem variabler - currval og PREVVAL - brukes til å lagre gjeldende verdi at sifferet representerer og den forrige verdien det representert

    Klassen har to konstanter erklærte at angi bredden og høyden på hver av de. numeriske verdier innenfor "Digit" filmklipp:
    statisk privat konst DIGIT_HEIGHT: uint = 25; statisk privat konst DIGIT_WIDTH: uint = 23;

    Disse konstantene blir brukt i ulike steder i hele klassen, den første er innenfor konstruktør:
    offentlig funksjon Digit () {currval = 1; PREVVAL = 1; scrollRect = new rektangel (0, 0, DIGIT_WIDTH, DIGIT_HEIGHT);}

    Som nevnt tidligere, vil bare én verdi vises til enhver tid innenfor "Digit" filmklipp. Dette kan oppnås ved å tegne en maske i "Digit" filmklipp tidslinje, men masker er CPU intensive og anbefales ikke for mobile enheter. En alternativ tilnærming til å skape en maske er å sette en skjerm objektets scrollRect eiendom. De DIGIT_WIDTH og DIGIT_HEIGHT konstanter brukes her til å definere en rektangulær region som sitter over det første sifferet i filmklipp kolonne.

    I tillegg innenfor konstruktøren både currval og PREVVAL er misligholdt til -1, noe som indikerer at en verdi har ennå ikke er satt for sifret via sin verdi eiendom

    Nå la oss se på den metoden som gjør at innstillingen av verdien boligen.
    offentlig funksjon innstilt verdi (verdi: int): void {//Sett sifret verdi. PREVVAL = currval; currval = verdi% 10; //Hvis det er første gang så snapper til verdien. //Ellers flytte til verdien. if (PREVVAL == -1) {snapColumn (); } Else {moveColumn (); }}

    Annet enn å sette den nye verdien og lagrer den forrige verdien bestemmer denne metoden om å rulle 'kolonne' eksempel er filmklipp til den nye verdien eller om det skal festes til det. Husk, når verdien er satt for første gang vi rett og slett ønsker å plassere 'kolonne' eksempel ved at verdien snarere enn å rulle.

    Det mest kompliserte metode innen denne klassen er moveColumn (), som er ansvarlig for å skyve den "kolonne" eksempel for å vise den korrekte verdi for brukeren. Metoden er godt kommentert og er vist nedenfor:
    privat funksjon moveColumn (): void {//Stopp kolonne fra animere. TweenLite.killTweensOf (kolonne); //Sikre at vi starter fra øvre halvdel av kolonnen. if (column.y < - (DIGIT_HEIGHT * 10)) {column.y + = (DIGIT_HEIGHT * 10); } //Finn ut hvor mange vi er i dag stoppet på. Var valStoppedAt: int = Math.abs (column.y /DIGIT_HEIGHT); //Beregn y-posisjon kolonnen må flyttes til å //vise den nye dagens antall. Var targY: Number = -currVal * DIGIT_HEIGHT; //Hvis den nye nåværende verdien er mindre enn verdien vi stoppet på //da må vi simulere sifret innpakning tilbake rundt. For å gjøre //dette, vil vi rulle inn i bunnen halvparten av kolonnen. if (currval < valStoppedAt) {targY - = (DIGIT_HEIGHT * 10); } //Utfør selve rulle animasjon på kolonnen. Var varighet: uint = Math.abs (column.y - targY) /DIGIT_HEIGHT; TweenLite.to (kolonne, varighet, {y: targY, lette: Linear.easeNone});

    For de som krever nærmere forklaring, her er noen pseudo-kode som skal gjøre ting klarere}:


      Hvis 'kolonne' ruller til en posisjon, stoppe det.

      Hvis du på en verdi i nedre halvdel av kolonnen "og deretter hoppe til samme verdi i øvre halvdel.
      < li> Beregn målet y-posisjon kolonnen "må flyttes til for å avsløre den nåværende verdien i den øverste halvdel av kolonnen.

      Hvis den nåværende verdien er mindre enn den forrige verdien deretter justere målet y-posisjon for å sikre at vi bla til samme verdi i de nederste halvdel.

      Bruk TweenLite, utløse rulle animasjon til målet y-posisjon.

      Alt som gjenstår å gjøre nå er knytte klassen til "Digit" filmklipp i biblioteket.

      Høyreklikk på "Digit" filmklipp i biblioteket og velg Egenskaper ... å ta opp Symbol dialogboksen Egenskaper

      I dialogboksen, klikk på "Export for Action 'boksen og skriv" Digit "inn i Class-feltet.

      Klikk OK og lagre din FLA <. br>

      Nå er det på tide å teste Digit klasse og sikre at det fungerer som forventet



      Trinn 17:. Teste en Digit

      Vi kommer nærmere å fullføre kilometerteller, men før vi går videre la oss teste Digit klassen og se den i aksjon.

      Vi bruker Application klassen for rask test.

      Først drar en forekomst av ' Digit 'filmklipp fra biblioteket på roten tidslinjen. Navn forekomsten 'tallet' og plasserer den på scenen på (158, 449):

      Innen Application.as, legge til følgende medlem variabel referanse til 'tallet' filmklipp eksempel:
      offentlig Var siffer: Digit; offentlig Var speedometer: Speedometer, private Var geolocation: IGeolocation;

      Nå, la oss gi den sifret et standardverdien ved å legge til følgende linje på slutten av Application klassens konstruktør:
      geolocation.setRequestedUpdateInterval (1000 ); geolocation.addEventListener (GeolocationEvent.UPDATE, handleGeolocationUpdate); digit.value = 6;.

      Lagre klassen

      Publiser og teste dette på skrivebordet ved å velge Control | Test Movie | i Flash Professional.



      Previous: