Lag en jevn Rolling Scroller med AS3

Create en Smooth Rolling Scroller med AS3
4
Del
to
Del
Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

I denne opplæringen vil du lære hvordan å lage en rullende liste aktiveres av musen opp og ned bevegelser, med forskjellige hastigheter basert på plasseringen av markøren. Jeg skal også dekke forbereder liste data med PHP, lasting XML-data og en kort forklaring av algoritmen jeg kom opp med. Nyt




Trinn 1: Innledning

Den andre dagen, da jeg var å teste en smart telefon, så jeg en av disse kule, ryddig liste scroller tweening effekter. Så begynte jeg å tenke på hvordan jeg kunne oppnå en slik effekt i Flash, gjorde noen undersøkelser på nettet og ærlig fant ikke akkurat det jeg var ute etter. Så her er resultatet av min lille oppdraget



Trinn 2:. Planlegging av Application

Etter noen undersøkelser fant jeg en fin algoritme. Den angår bare de mus bevegelse med prosentdelen av det synlige området (senere, vil bli identifisert som å være masken) som faktisk blir påpekt. Deretter blir beholderen beveget i samme forhold.

La oss si, for eksempel, at musen er nær bunnen av det blå krøllete braketten. I dette scenariet beholderen ville flytte 20% mot toppen.

Som du kan se dette fungerer ganske bra. Når musepekeren når toppen eller bunnen av det synlige området, har vi vissheten om at vi har nådd begynnelsen eller slutten av listen. Denne teknikken er ganske grei fordi vi ikke trenger å bekymre deg listen nå, for eksempel, begynnelsen og fortsetter å flytte sammen.

Men ... Hva om vi har hundrevis av listeelementer? Nå har vi et problem. Hvis vår synlige området (maske) har, la oss si, 500 piksler i høyden og vi har en liste over 100 elementer (alt innhold område), hver av dem med en høyde på 20 piksler, å bevege musen 1/5 av det synlige området (maske) vil resultere i overgangen av 20 elementer (400px /20px) ved lysets hastighet. . Så jeg tror denne tilnærmingen vil ikke resultere godt

Så kom jeg opp med denne løsningen:

I utgangspunktet har jeg definert to soner - under og over sentrum. Hver sone har en verdi forbundet. Denne verdien er beregnet basert på avstanden mellom musepekeren og sentrum. Så, hvis vi faktisk knytte denne verdien med en variabel vi kunne endre hastigheten basert på museposisjonen. Minustegnet er bare for å avgjøre retningen av bevegelsen

Når det er sagt, la oss få noen reelle innholdet



Trinn 3:.. Griper Data

Vi skal bruke en ekstern xml fil for å mate programmet fordi:

Vi vil være i stand til å legge til, fjerne, redigere, slette data veldig lett

Actionscript 3 har en stor API å jobbe med xml

Så trenger vi en stor liste over elementer ... Hva om listen over land rundt om i verden?

(Dette trinnet er slags en ekstra emnet fordi jeg skal bruke andre språk for å hjelpe meg med xml fil forberedelse. Så hvis dette ikke er av din interesse ikke bekymre deg, vil dette være i nedlastingsfiler)

Jeg har bare googlet [liste land verden] og i det første resultatet jeg fikk denne listen:

1 Afghanistan

2 Akrotiri

(...)
< li> 256 Zambia

257 Zimbabwe

(kilde: http://www.listofcountriesoftheworld.com)

Kopier alt til noen tekstfil og lagre den. Jeg kalte det countries.txt.

Skriptet nedenfor er skrevet i PHP. Du trenger en web-server for å kjøre den. Jeg bruker WampServer, en fin pakke som installerer PHP, MySQL, og Apache med et par klikk.

For å bruke dette skriptet må du initialisere web server, og kjøre skriptet i en katalogen din \\ www \\ katalogen. Et siste notat: manuset og countries.txt må være i samme mappe
< php $ linjer = file ("countries.txt"); $ fp = fopen ('data.xml', '.? en '); fwrite ($ fp,' <? xml version = "1.0" encoding = "UTF-8" >? '"\\ n");. fwrite ($ fp,' < elementer > '". \\ n "); foreach ($ linjer som $ linje) {$ linje = RTRIM ($ linje," \\ r \\ n "); $ mønster = '/\\ d + \\ s * /'; $ erstatning = ''; $ linje = preg_replace ($ mønster, $ erstatning, $ linje); $ str = "\\ t". '< element >' . $ linje. '< /element >' . "\\ n"; fwrite ($ fp, $ str);} fwrite ($ fp, '< /elementer >'); fclose ($ fp); >

Resultatet av dette skriptet vil bli lagret i en fil med navnet data.xml. Hvis du ikke forstår dette trinnet ikke bekymre deg fordi du kan laste det ned her



Trinn 4:. Sette opp FLA fil

Hvis du ser på demoen, du vil merke at vår søknad har et grensesnitt, knapper og så videre. Så la oss begynne å sette all grafikken sammen

Åpne Adobe Flash og opprette en ny Actionscript 3-fil med følgende innstillinger.

  • Bredde: 450px

    Høyde : 500px

    frame rate: 63

    Klasse: document

    Lagre filen. Jeg har kalt meg scroll.fla



    Trinn 5:. Bakgrunnsbildet

    Fil > Import > Import Stage og velg background.jpg bilde (alle bildene er tatt med i assets.zip, innenfor kilden nedlasting)

    Nå:.

    Vindu > justere

    Dette vil åpne Align Panel. Midtstille bildet på scenen klikke på knappene som vises i bildet nedenfor

    Og nå gir ditt lag navnet Bakgrunn (ikke glem å låse den).



    Trinn 6: Scroller sin bakgrunn

    Lag et nytt lag og importere bildet pad.png. Prosessen med import er nettopp det samme som forrige trinn. Trykk F8 for å konvertere den til en MovieClip og gi den navnet mcPad. Neste klikk på Eksporter for Action boksen, og i klasse input-feltet skriver du navnet Pad.

    I utgangspunktet vi definerer puten MovieClip som en underklasse av MovieClip klasse selv. Derfor er vi i stand til å bruke det direkte fra vår kode og behandle det som en vanlig MovieClip siden det arver fra MovieClip klasse. Ganske kul ikke sant?

    Nå slette dette tilfellet fra scenen, men ikke fra biblioteket (fordi som jeg sa vi skal bruke den fra koden).



    Trinn 7: Knappene

    Import bildet itemBackground.jpg trykke F8 for å konvertere den til en MovieClip. Gi den navnet mcItem. Igjen eksporterer for Actionscript og navngi klassen Element

    Nå prosessen vil være litt annerledes.

  • dobbeltklikk på mcItem MovieClip for å gjøre noen endringer inne

    gi nytt navn til det eneste laget der som Back og låse den

    opprette et nytt lag, og kaller det Over

    importere bildet itemBackground-over.jpg til Over lag

    konvertere den til en MovieClip og gi den et navn mcItemOver

    stilling mcItemOver MovieClip ved x = 0 og y = 0

    gi den en forekomst navn item_btn_over

    Endelig låse Over lag, komme tilbake til hovedtidslinjen, og slette mcItem filmklipp eksempel fra scenen



    Trinn 8:. The Font

    For dette programmet jeg m bruker Arial Rounded MT Bold Negrito font (det er en gratis font, jeg har lastet ned mine fra her). Siden det er ikke et system font vil vi måtte importere den også:

    på biblioteket separator klikk på øvre høyre knappen (den med en liten pil)

    velg New Font

    kalle det fontArialRounded, velg font på rullegardinboksen under. Igjen Export for Actionscript og i klassen feltet gi den navnet ArialRounded

    I hovedtidslinjen vi trenger bare bakgrunnslaget, slik at du kan slette de gjenværende lagene.

    Det er det for Flash-redigeringsverktøyet. La oss starte koding



    Trinn 9:. Legge Application Bakgrunn for Stage

    Opprett en ny Actionscript-fil, lagre den som DocumentClass.as. Deretter legger du denne koden:
    pakke {import flash.display.MovieClip; public class document strekker MovieClip {private Var _pad: MovieClip; offentlig funksjon document () {_pad = new Pad (); addChild (_pad); _pad.x = stage.stageWidth /2 - _pad.width /2; _pad.y = stage.stageHeight /2 - _pad.height /2; }}}

    (Hvis du er usikker på hva vi gjør her, sjekk ut denne rask innføring dokumentere klasser.)

    Husk på mdPad
    MovieClip? Husk at vi har eksportert det for Actionscript. Så når vi ønsker å bruke denne MovieClip vi bare nødt til å skrive
    ny Pad ();

    Denne koden skaper i utgangspunktet en forekomst av mcPad
    MovieClip og legger det til scenen ved hjelp av addChild ( ) metoden. Så nå er _pad
    på vår DisplayList!

    Så jeg har sentrert den på scenen (vertikalt og horisontalt).

    Test programmet og du skal se bakgrunnen layout på flash player



    Trinn 10:. Container

    Vår søknad vil bruke en beholder for å holde alle elementene sammen. Så skal vi lage en ny MovieClip i document. Erklære eiendommen:
    private Var _container: MovieClip;

    Inne konstruktøren, på slutten:
    _container = new MovieClip (); addChild (_container);



    Trinn 11: Importere XML Data

    Legg til følgende import uttalelser:
    import flash.events.Event, import flash.net.URLRequest, import flash.net.URLLoader;

    Erklærer følgende egenskaper:
    offentlig Var loader: URLLoader; offentlig Var data: XML, offentlige Var poster: XMLList;

    Så gjennomføre følgende metoder:
    privat funksjon dataload (): void {loader = new URLLoader (); loader.addEventListener (Event.COMPLETE, dataLoaded); loader.load (ny URLRequest ("data.xml"));} private funksjon dataLoaded (hendelse: Hendelse): void {trace (". data Loaded");}

    Til slutt legger denne metoden kallet til konstruktøren:
    dataload ();

    Så langt har vi:
    pakke {import flash.display.MovieClip; import flash.events.Event; import flash.net.URLRequest; import flash.net.URLLoader; public class document strekker MovieClip {private Var _pad: MovieClip; private Var _container: MovieClip; offentlig Var loader: URLLoader; offentlig funksjon document () {_pad = new Pad (); addChild (_pad); _pad.x = stage.stageWidth /2 - _pad.width /2; _pad.y = stage.stageHeight /2 - _pad.height /2; _container = new MovieClip (); addChild (_container); dataload (); } Private funksjon dataload (): void {loader = new URLLoader (); loader.addEventListener (Event.COMPLETE, dataLoaded); loader.load (ny URLRequest ("data.xml")); } Private funksjon dataLoaded (hendelse: Hendelse): void {trace (ny XML (event.target.data.toString ())); }}}

    Test programmet og du skal se, i konsollen, alle XML-data. La oss gå videre



    Trinn 12: Bygge Hver knapp

    Legg til følgende import uttalelser.
    Import flash.text.TextFormat, import flash.text.TextField; import flash .text.TextFieldAutoSize, import flash.text.Font;

    Legg disse nye variabler:
    offentlig Var data: XML, offentlige Var poster: XMLList; private Var _item: Element; private Var _itemTextField: Textfield, private Var _defaultFormat : tekstformat = new tekstformat (); privat Var _arialRounded: Font = new ArialRounded (); privat Var _textFieldXPosition: uint = 10; privat Var _textFieldYPosition: uint = 13; privat Var _textFieldWidth: uint = 240; privat Var _textFieldHeight: uint = 25; private Var _itemPosition: uint = 49;

    Oppdater dataLoaded metode:
    privat funksjon dataLoaded (hendelse: Hendelse): void {//Denne eiendommen har lastet xml data data = new XML (event.target.data ); //Element eiendommen innehar alle gjentakende element elementer elementer = data.item; //Dette gjentar enn hvert element for (var i = 0, jeg < items.length (); i ++) {//husker mcItem? Vi er forekomster som MovieClip _item = ny vare (); //Setter Over lag MovieClip alfa til 0 _item.item_btn_over.alpha = 0; //Oppretter Element tekstfeltet _itemTextField = new Textfield (); _itemTextField.x = _textFieldXPosition; _itemTextField.y = _textFieldYPosition; _itemTextField.selectable = false; _itemTextField.width = _textFieldWidth; _itemTextField.height = _textFieldHeight; _itemTextField.embedFonts = true; _defaultFormat.color = 0x111112; _defaultFormat.font = _arialRounded.fontName; _defaultFormat.size = 18; _itemTextField.defaultTextFormat = _defaultFormat; _itemTextField.text = elementer [i] .toString (); //Legger tekstfeltet til elementets visningsliste _item.addChild (_itemTextField); //Stillinger hvert element vertikalt basert på iterasjon verdi _item.y = i * _itemPosition; _item.buttonMode = true; _item.mouseChildren = false; //Legger til elementet i beholderen visningslisten _container.addChild (_item); }}

    Nå har vi opprettet 200 + knapper og sette dem på skjermen. Hvis du kjører programmet vil du legge merke til at denne listen begynner på posisjon (0, 0) og fyller ned hele scenen. Det er ikke det vi ønsker så la oss håndtere det i neste trinn



    Trinn 13:. Maske listen

    La oss lage en form for å maskere listen, slik at vi bare ser den synlige Området, som i bildet fra før:

    I slutten vi vil sentrere maske og beholderen. Så, legge til en annen import uttalelse:
    import flash.display.Shape;

    Egenskaper:
    private Var _mask: Shape; private Var _maskWidth: uint = 288; privat Var _maskHeight: uint = 290; private Var _paddingTop : uint = 120;

    Og ... I dataLoaded metoden på slutten, legg til følgende kode:
    _mask = new Shape (); _ mask.graphics.beginFill (0xff0000); _ mask.graphics.drawRect ( 0, 0, _maskWidth, _maskHeight); _ mask.graphics.endFill (); //sentrum masken horisontalt på stage_mask.x = stage.stageWidth /2 - _container.width /2; //stillinger masken vertikalt på 120px fra den top_mask.y = _paddingTop; addChild (_mask); //tildeler masken til container_container.mask = _mask; //sentre beholderen horisontalt på stage_container.x = stage.stageWidth /2 - _container.width /2; //posisjonerer beholderen vertikalt på et visst value_container.y = _paddingTop;



    Trinn 14: Legge til en bakgrunn til Container

    Bare en liten forbedring ... Akkurat nå vår container har mye hull fordi det er en margin mellom hvert element. Så la oss gi den en bakgrunn for å unngå uønskede resultater når du lytter til arrangementer

    Eiendom:
    private Var _background. Shape;

    Fortsatt i dataLoaded metoden, under den eksisterende koden:
    _background = new Shape (); _ background.graphics.beginFill (0xFFFFFF); _ background.graphics.drawRect (0, 0, _container.width, _container.height); _ background.graphics.endFill (); _ container.addChildAt (_background, 0);



    Trinn 15: Legge Event Lyttere

    Som du sikkert vet, lyttere for hendelser. Her vil vi bruke en for mouse arrangementet og en annen for mouseout hendelsen

    Legg til dette på slutten av dataLoaded metode.
    _container.addEventListener (MouseEvent.MOUSE_OVER, movingOver); _ container.addEventListener (MouseEvent.MOUSE_OUT, movingOut);

    La oss nå gjennomføre movingOver og movingOut metoder:
    privat funksjon movingOver (event: MouseEvent): void {_container.removeEventListener (MouseEvent.MOUSE_OVER, movingOver); } private funksjon movingOut (event: MouseEvent): void {_container.addEventListener (MouseEvent.MOUSE_OVER, movingOver); }

    Nå kan vi lytte til arrangementer, mer spesifikt MOUSE_OVER og MOUSE_OUT. Hendelser er like meldinger som varsler ethvert objekt venter på den samme hendelsen. "Budskapet" sender bare at hendelsen har funnet sted. I dette tilfellet _container objektet vil bli lyttet til mouse og mouseout hendelser. Når de finner sted den _container har evnen til å reagere deretter.

    Så første vi tildele arrangementet lyttere til _container objektet og deretter senere, hvis _container er svevde over mouse lytteren blir fjernet. Tvert imot, når musen er ute av _container protestere musen over lytteren er tildelt igjen til _container



    Trinn 16:. Hendelses Flow

    Arrangementet flyt er en kraftig mekanisme som gjør at programmerer for å håndtere flere objekter med bare én hendelse lytteren. Så, som du sikkert forestille deg, _container.addEventListener vil "lytte" for hendelser som involverer beholderen, elementene og bakgrunnen form - det vil si, container og alt inni den. Du kan kontrollere dette ved å legge inn følgende kode i movingOver Hotell og movingOut
    metoder:
    trace (event.target);

    Dette vil spore objekt som sendes hendelsen.



    Trinn 17: onEnterFrame

    Når du lytter til denne hendelsen vi kan definere en atferd som finner sted hver ramme, i vårt tilfelle 63 ganger per sekund. Det er derfor onEnterFrame hendelsen er svært nyttig for animasjoner basert på fps. Vi trenger dette for å flytte vår scroll, så movingOver og movingOut metoder skal se slik ut:
    privat funksjon movingOver (event: MouseEvent): void {_container.removeEventListener (MouseEvent.MOUSE_OVER, movingOver); addEventListener (Event.ENTER_FRAME, enterframe);} private funksjon movingOut (event: MouseEvent): void {removeEventListener (Event.ENTER_FRAME, enterframe); _container.addEventListener (MouseEvent.MOUSE_OVER, movingOver); }



    Trinn 18: enterframe Method

    Legg disse egenskapene:
    private Var _maxSpeed: uint = 15; privat Var _speed: Number;

    Legg følgende metode på slutten av koden (under movingOut metoden). Dette vil bli kjørt hver ramme, takket være enterframe hendelsen lytteren vi opprettet tidligere. Jeg skal forklare hva denne koden gjør under
    funksjon enterframe (hendelse: Hendelse):. Void {_speed = (_mask.height /2 - _mask.mouseY) /(_mask.height /2) * _maxSpeed; _container.y + = _speed; if (_container.y > = _paddingTop) {removeEventListener (Event.ENTER_FRAME, enterframe); _container.y = _paddingTop; } If (_container.y < = _mask.height - _container.height + _paddingTop) {removeEventListener (Event.ENTER_FRAME, enterframe); _container.y = _mask.height - _container.height + _paddingTop; }}

    Og her er logikken i scroller:
    _speed = (_mask.height /2 - _mask.mouseY) /(_mask.height /2) * _maxSpeed;

    Denne linjen med kode får hastigheten ved å dele halvparten av takhøyde med musen Y posisjon.

    La oss si at halvparten av scenen er 200px og musepekeren er i posisjon 300px. Bruk av formelen får vi:

    (200-300) /200 * 15 (_maxSpeed ​​eiendom) = -7,5 som er negative, så listen vil gi oss en nedadgående bevegelse. Det er nettopp det vi er ute etter. Hvis musepekeren var ovenfor sentrum ville vi ha en positiv verdi, og listen ville flytte opp

    Neste, med denne uttalelsen.
    _container.y + = _speed;

    Vi tildele virkelige hastighet, for hver ramme (63 ganger per sekund) i _container.y stilling. Så vi sjekke med hvis uttalelser om containerens y posisjon er der den skal være. Husk dette bildet:



    Trinn 19: Animere element Button

    Jeg kommer til å bruke greensock sin TweenMax Library (du kan laste det ned her) for å animere hver knapp på og av (når musen svever over eller forlater elementet).

    Oppdater movingOver Hotell og movingOut
    metoder; *
    import gs::
    privat funksjon movingOver (event:

    Legg denne importen uttalelse. MouseEvent): void {_container.removeEventListener (MouseEvent.MOUSE_OVER, movingOver); addEventListener (Event.ENTER_FRAME, enterframe); if (event.target er Element) TweenMax.to (Element (event.target) .item_btn_over, 0,2, {alfa: 1});} private funksjon movingOut (event: MouseEvent): void {removeEventListener (Event.ENTER_FRAME, enterframe ); _container.addEventListener (MouseEvent.MOUSE_OVER, movingOver); if (event.target er Element) TweenMax.to (Element (event.target) .item_btn_over, 0,2, {alpha: 0});}

    La oss analysere denne koden i detalj. Den event.target vil referere til objektet som skal ekspedere arrangementet, i dette tilfellet Mouse eller mouseout. Dette objektet kan være en _item, den _background eller _container men vi er bare interessert i varen objekter så vi spesifisere:
    if (event.target er Element)

    Så, hvis så, vi vil animere hva Element objekt sendt hendelsen ved å skrive vare (event.target) .item_btn_over. item_btn_over
    er forekomsten navnet på mcItemOver
    MovieClip som vi opprettet i trinn 7. 0,2
    er animasjonen tid, og i den siste parameteren vi angi hvilke egenskapen vi ønsker å animere (alpha)



    Trinn 20:. refactoring

    Akkurat nå vår applikasjon fungerer ganske greit. Vi har imidlertid noen kode gjentatt og en svært sentralisert programmet også. Legg merke til at dataLoaded metoden gjør nesten alt.

    Action har utmerket støtte for objektorientert programmering. Vi kunne bruke den til å koble data lasting fra programmet logikken etc.

    Det er en fin design mønster kalt Model View Controller som fungerer veldig bra med brukergrensesnitt. Dette mønsteret i hovedsak skiller anvendelsen av tre forskjellige lag. The Model omhandler forretningslogikk, datahåndtering. Kontrolleren omhandler menneskelig interaksjon med programmet. Og til slutt Se avtaler med det visuelle grensesnittet av søknaden.

    I dette tilfellet søknaden vår er for liten til å gjennomføre dette mønsteret. Så, la oss tilpasse akkurat den modellen og en diverse View /Controller til søknaden vår. Først la oss bare håndtere noen gjentatte kode



    Trinn 21:. Vanlige oppgaver

    Opprett en ny Actionscript-fil og skriv inn følgende kode:
    pakke com.tutsplus.active.util {import flash.display. *; public class Strek {public static funksjon centerInStage (stadium: Stage, mc: Displayobject): void {mc.x = stage.stageWidth /2 - mc.width /2; mc.y = stage.stageHeight /2 - mc.height /2; } Public static funksjon centerHorizontallyInStage (stadium: Stage, mc: Displayobject): void {mc.x = stage.stageWidth /2 - mc.width /2; } Public static funksjon centerVerticallyInStage (stadium: Stage, mc: Displayobject): void {mc.y = stage.stageHeight /2 - mc.height /2; }}}

    Vi må utføre denne oppgaven flere ganger. Så jeg bestemte meg for å lage en klasse som er justert noe skjerm objekt på scenen når vi kaller det. For å gjøre dette arbeidet må du lage en katalogstruktur som dette:

    \\ com \\ tutsplus \\ aktiv \\ util \\

    i produksjonen din katalog eller inni klassen banen. Deretter i refactored document vil du se hvordan du bruker denne klassen



    Trinn 22:. Modell

    Modellen styrer atferden og data av søknaden domenet, svarer på forespørsler om informasjon om sin tilstand (vanligvis fra visningen) og reagerer på instruksjonene for å endre tilstand (vanligvis fra kontrolleren)

    kilde:. MSDN

    Legge dataene og lagre den i datastrukturer er fin operasjoner for å komponere vår modell. Opprett en ny Actionscript-fil og kaller det ScrollModel.as:
    pakke {import flash.events.Event; import flash.net.URLRequest; import flash.net.URLLoader; import flash.events.EventDispatcher; klasse ScrollModel strekker EventDispatcher {public Var loader: URLLoader; offentlig Var data: XML; offentlige Var elementer: XMLList; public static konst MODEL_UPDATE: String = "modelChange"; offentlig funksjon ScrollModel () {loader = new URLLoader (); loader.addEventListener (Event.COMPLETE, dataLoaded); } Offentlig funksjon belastning (req: URLRequest): void {loader.load (req); } Private funksjon dataLoaded (hendelse: Hendelse): void {data = new XML (event.target.data); elementer = data.item; dispatchEvent (ny hendelse (ScrollModel.MODEL_UPDATE)); }}}

    Med denne oppdateringen vår dataLoaded
    metoden har bare tre linjer med kode nå!

    Det er nesten den samme koden som vi brukte i document for lasting av data, med En vesentlig forskjell er
    dispatchEvent (ny hendelse (ScrollModel.MODEL_UPDATE));

    Etter å tildele våre 200 + elementer til XMLList eiendom denne linjen med kode sender en hendelse til den som lytter. I praksis vil vi trenger å vite når dette skjer for å bruke disse dataene i en annen klasse



    Trinn 23:. Den ScrollBox Class

    Opprett en ny Actionscript-fil og kall den ScrollBox.as :
    pakke {import flash.display.Sprite; import flash.display.Stage; import flash.events.Event; import flash.events.MouseEvent; import flash.display.Shape; import flash.text.TextFormat; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.Font; import gs. *; import com.tutsplus.active.util.Align; public class ScrollBox strekker Sprite {private Var _container: Sprite; private Var _item: Element; private Var _itemTextField: Textfield; private Var _defaultFormat: tekstformat = new tekstformat (); private Var _arialRounded: Font = new ArialRounded (); private Var _textFieldXPosition: uint = 10; private Var _textFieldYPosition: uint = 13; private Var _textFieldWidth: uint = 240; private Var _textFieldHeight: uint = 25; private Var _itemPosition: uint = 49; private Var _mask: Shape; private Var _maskWidth: uint = 288; private Var _maskHeight: uint = 290; private Var _paddingTop: uint = 120; private Var _background: Shape; private Var _maxSpeed: uint = 15; private Var _speed: Number; private Var _items: XMLList; private Var _stage: Stage; offentlig Var scrollModel: ScrollModel; offentlig funksjon ScrollBox (stadium: Stage, m: ScrollModel) {this.scrollModel = m; this._stage = scenen; scrollModel.addEventListener (ScrollModel.MODEL_UPDATE, createRollingScroller); } Private funksjon createRollingScroller (hendelse: Hendelse = null): void {_container = new Sprite (); _stage.addChild (_container); _items = scrollModel.items; for (var i = 0; i < _items.length (); i ++) {_item = ny vare (); _item.item_btn_over.alpha = 0; _itemTextField = new Textfield (); _itemTextField.x = _textFieldXPosition; _itemTextField.y = _textFieldYPosition; _itemTextField.selectable = false; _itemTextField.width = _textFieldWidth; _itemTextField.height = _textFieldHeight; _itemTextField.embedFonts = true; _defaultFormat.color = 0x111112; _defaultFormat.font = _arialRounded.fontName; _defaultFormat.size = 18; _itemTextField.defaultTextFormat = _defaultFormat; _itemTextField.text = _items [i] .toString (); _item.addChild (_itemTextField); _item.y = i * _itemPosition; _item.buttonMode = true; _item.mouseChildren = false; _container.addChild (_item); } _background = New Shape (); _background.graphics.beginFill (0xFFFFFF); _background.graphics.drawRect (0, 0, _container.width, _container.height); _background.graphics.endFill (); _container.addChildAt (_background, 0); _mask = new Shape (); _mask.graphics.beginFill (0xff0000); _mask.graphics.drawRect (0, 0, _maskWidth, _maskHeight); _mask.graphics.endFill (); Align.centerHorizontallyInStage (_stage, _mask); _mask.y = _paddingTop; addChild (_mask); _container.mask = _mask; Align.centerHorizontallyInStage (_stage, _container); _container.y = _paddingTop; _container.addEventListener (MouseEvent.MOUSE_OVER, movingOver); _container.addEventListener (MouseEvent.MOUSE_OUT, movingOut); } Private funksjon movingOver (event: MouseEvent): void {_container.removeEventListener (MouseEvent.MOUSE_OVER, movingOver); addEventListener (Event.ENTER_FRAME, enterframe); if (event.target er Element) TweenMax.to (Element (event.target) .item_btn_over, 0,2, {alfa: 1}); } Private funksjon movingOut (event: MouseEvent): void {removeEventListener (Event.ENTER_FRAME, enterframe); _container.addEventListener (MouseEvent.MOUSE_OVER, movingOver); if (event.target er Element) TweenMax.to (Element (event.target) .item_btn_over, 0,2, {alpha: 0}); } Funksjon enterframe (hendelse: Hendelse): void {_speed = (_mask.height /2 - _mask.mouseY) /(_mask.height /2) * _maxSpeed; _container.y + = _speed; if (_container.y > = _paddingTop) {removeEventListener (Event.ENTER_FRAME, enterframe); _container.y = _paddingTop; } If (_container.y < = _mask.height - _container.height + _paddingTop) {removeEventListener (Event.ENTER_FRAME, enterframe); _container.y = _mask.height - _container.height + _paddingTop; }}}}

    Legg merke til de Juster klassen metoder som vi bruker:
    Align.centerHorizontallyInStage (_stage, _mask); Align.centerHorizontallyInStage (_stage, _container);.

    Nå er vi bare nødt til å bruke metoden Align.centerHorizontallyInStage () for å justere en skjerm objekt horisontalt

    createRollingScroller metoden vil bare starte når vi er ferdig med å lagre all . data i elementene: XMLList eiendom



    Trinn 24: Sluttdocument

    Endre document:
    pakke {import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; import flash.net.URLLoader; import flash.events. *; import com.tutsplus.active.util.Align; public class document strekker MovieClip {private Var _pad: MovieClip; offentlig Var scrollModel: ScrollModel; offentlig Var scrollBox: ScrollBox; offentlig funksjon document () {config (); scrollModel = new ScrollModel (); scrollModel.load (ny URLRequest ("data.xml")); scrollBox = new ScrollBox (stadium, scrollModel); } Private funksjon config (): void {_pad = new Pad (); addChild (_pad); Align.centerInStage (stadium, _pad); }}}

    Igjen, legg merke til hvor lett det er å sentrere visningsobjekter på scenen med Align.centerInStage () metode:
    Align.centerInStage (stadium, _pad);
    Konklusjon
    < p> Det er det for nå folkens! Jeg har dekket noen interessante Actionscript 3 emner og jeg håper du finner dette nyttig. Hvorfor ikke forbedre dette programmet til et nytt nivå, recfactoring, og legger til funksjonalitet, etc?

    Takk for følge. Ta vare! Anmeldelser