Gå Round the Bend med tekst på en bane i Flash

Go Round the Bend med tekst på en bane i Flash
Del
Del
Del
Share < .no> Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

Flash tekstformatering er virkelig flott, men de eneste transformasjoner vi kan utføre er vanlig MovieClip eksempler. Hvis din designer ber deg om å plassere godt formatert tekst på en sirkulær bane, er det ingen innebygd transformasjon verktøy for å få jobben gjort ...


Vi vil se hvordan å eksplodere Textfield og plassere alle tegnene sammen slik kurve, bevare tekstformatering og tegnavstand. Til slutt vil vi ta en titt på hvordan å tegne tekst langs en spiral



Endelig resultat Forhåndsvisning

La oss ta en titt på det endelige resultatet vi skal jobbe mot.

Endre teksten i tekstfeltet og leke rundt med parametrene ..

Tenk deg dette oppdiktet scenario: Mandag morgen, du drikker kaffe, og deretter din grafisk designer kommer og vekker ber deg "Hei, Jeg designe spillet lasting animasjon, og jeg vil gjerne ha den innlastingen teksten passer denne sirkelen;? Jeg antar du har noe jeg kan kopiere og lime inn for å gjøre jobben"

Og faktum er at du ikke allerede har noe å enkelt legge ut tekst på denne måten. Så du kommer hit og lese denne artikkelen. Vi vil gå skritt for skritt for å bygge det du er ute etter, og starter med den grunnleggende matematikk kunnskap til å plassere et punkt langs en sirkel, finne noe sted å sette den, i henhold til sin opprinnelige posisjon i en container, hvordan bevare tegnformatering og avstand (ellers designeren ville aldri godta oppløsning) og deretter samle alle disse delene til en generisk klasse som vil gjøre det enkelt å sette opp og forvandle enhver dynamisk tekst for å bruke dette rundskrivet layout.

font brukt i demoen er gratis elegan Tech skriften du kan laste ned og fritt bruke fra dafont.com

De første trinnene vil vise i detalj hvordan du oppretter testen Flash movie. Hvis du allerede er kjent med bruken av Flash-komponenter og deres event håndtering, kan det være lurt å hoppe direkte til trinn 10, hvor det virkelige arbeidet begynner, når utgangspunktene er satt.



Trinn 1: Demo Interface Demo Flash File

Start med å lage en ny CircularTextTest.fla fil med Flash Professional, åpne deretter Components vinduet og dra en skyveknapp, en etikett og en boksen for å din Flash biblioteket.

I Flash-fil, lage en stor tekstfeltet, og deretter sette det som en innspill
Textfield og gi den navnet: tfTemplate. For denne demoen har vi valgt å bruke EleganTech font, så setter Textfield font verdi til dette, og deretter importere skriften og sørge for at de nødvendige tegnene varierer importeres.

Dra og slipp av i boksen fra biblioteket til scenen, og deretter kopiere og lime den 3 ganger. Hver avkrysnings vil bli brukt til å sette en demo parameter: vis /skjul ankere, slå tekst utvendig /innvendig, trim (eller ikke) den tomme plassen.

Etiketten og valgte verdier er opp til deg, for å sette startverdiene av demoen. Det viktigste er å sette eksempel navnene på de avmerkingsboksene for å kunne bruke dem. Den første vil være chkShowAnchors, den andre en chkTxtOutside og den tredje chkTrimWhite.

Til slutt vil vi trenge en glidebryter for å sette verdien av sirkelen radius, og en annen til å justere karakteren forskjøvet fra ankrene vi vil plass. Hver slider vil komme med en etikett der vi vil vise den faktiske verdien. Så du kan dra og slippe en etikett og en skyveknapp fra biblioteket til scenen, og deretter sette sitt navn og parametre som på dette skjermbildet.

Bortsett fra forekomstnavn som er obligatorisk, de viktige parametrene er slideren verdi, som vi vil bli brukt som den opprinnelige standard verdi, minimums- og maksimumsverdier. Den liveDragging parameter vil gjøre slider send en hendelse mens den blir dratt, slik at vi vil oppdatere sirkelen i sanntid når brukeren flytter glidebryteren. Hvis liveDragging ikke er merket, vil oppdateringen bare skje når brukeren slipper glidebryteren.

Nå kan du lage den andre glideren og tilhørende label, henholdsvis heter sliderCharOffset og labelOffset. For demoen har jeg brukt standardverdien 7, min og max verdier fra -50 til 50, men dette er opp til deg, kan du sette den til å passe dine behov. Endelig
du kan angi dokument klassen være CircularTextTest, som vil være vert for all demo kode. Klassen er ennå ikke skapt, dette er neste steg, akkurat nå er det bare å sette klassenavnet i Flash-filen, som forklart i Slik bruker du et dokument klasse i Flash Quick Tips.

Flash-filen er nå fullført. Hvis du er i tvil kan du sjekke filen fra de nedlastbare kilder



Trinn 2:. Demo Interface Demo Class

I dette trinnet vi skape klassen, knytte den med Flash fil og skrive ned sin grunnleggende innhold. en addedToStage handler funksjon og grunn createCircularText rutine som vi vil kalle å forvandle teksten

La oss lage CircularTextTest.as Class filen sammen din Flash-fil. Den aller første skritt vil være å importere klassene vi trenger, for å erklære eiendelene vi har satt på scenen og å forberede rutinen vi vil ringe for å gjøre jobben.
pakke {import fl.controls.CheckBox; import fl.controls.Label; import fl.controls.Slider; import fl.events.SliderEvent; import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TextEvent; public class CircularTextTest strekker MovieClip {/* ----- Eiendeler definert i Flash tidsplan for demo ----- * //** The redigerbare Textfield * /public Var tfTemplate: Textfield; /** Checkbox: showet karakter forankrer * /public Var chkShowAnchors: avmerkingsbokser; /** Checkbox: tekstretning * /public Var chkTxtOutside: avmerkingsbokser; /** Checkbox: trimWhite /condenseWhiteSpace * /public Var chkTrimWhite: avmerkingsbokser; /** Slider: verdien av sirkelen radius * /public Var sliderRadius: Slider; /** Etiketten for å vise gjeldende radius verdien * /public Var labelRadius: Etikett; /** Slider: forskyvningen av figurene fra sirkelen * /public Var sliderCharOffset: Slider; /** Etiketten for å vise gjeldende offset verdien * /public Var labelOffset: Etikett; offentlig funksjon CircularTextTest () {stop (); addEventListener (Event.ADDED_TO_STAGE, onAddedToStage); } Beskyttet funksjon onAddedToStage (evt: Hendelses): void {createCircularText (); } Beskyttet funksjon createCircularText (): void {//Her vil kommer alle de interessante kode}}}

Dette er den grunnleggende struktur, nå vil vi ha for å fylle ut feltene for å sørge for at vi bruke verdiene fra tekstfeltet, boksene, og glidere.



Trinn 3: Demo Interface Input Textfield

Vi må sørge for at vi vet når innholdet i tekstfeltet er endret, så vi vil fullføre initSwf initialisering behandleren å legge hendelsen lyttere til endring og textInput hendelser. Disse hendelsene vil kalle sin egen tilbakering, noe som igjen vil kalle createCircularText () rutine. Dette ekstra trinnet er der for hvis du ønsker å utføre noen validering ting avhengig av hendelsen type; å gi et eksempel, kan det være lurt å legge litt kode for å sørge for at teksten er gyldig, eller å utføre noen spesielle ting når teksten er tom, før du ringer createCircularText () -metoden.
beskyttet funksjon onAddedToStage (evt: Hendelses): void {tfTemplate.addEventListener (TextEvent.TEXT_INPUT, onTextInputHandler, falsk, 0, true); tfTemplate.addEventListener (Event.CHANGE, onTextChangeHandler, falsk, 0, true); createCircularText ();} beskyttet funksjon onTextInputHandler (evt: TextEvent): void {createCircularText ();} beskyttet funksjon onTextChangeHandler (evt: Hendelses): void {createCircularText ();}



Trinn 4: Demo Interface Tekstretning avkrysningsruten

Den boksen er allerede satt opp og klar i Flash, så vi trenger bare å lytte etter oppdateringer til chkTxtOutside sjekkheftet. Akkurat som for inntastingsfeltet, oppdaterer vi vår initialisering rutine for å legge til en hendelse lytteren for endringen hendelsen fra sjekkheftet. Denne gangen vil vi bruke bare én generisk onCheckBoxChange hendelsen tilbakeringing for alle aktuelle alternativer, som vi vil skape akkurat nå
beskyttet funksjon onAddedToStage (evt: Hendelses):. Void {//... //Forrige code fortsatt her //... chkTxtOutside.addEventListener (Event.CHANGE, onCheckBoxChange, falsk, 0, true); //stage.addEventListener(MouseEvent.CLICK, onCheckBoxChange); //Lazy-mann lytteren å oppdatere sirkelen etter hvert klikk på en komponent. createCircularText ();} beskyttet funksjon onCheckBoxChange (hendelse: Hendelse): void {createCircularText ();}

Hvis du leser kommentarene du kanskje merke jeg har igjen kommen en veldig lat implementering som du kan finne nyttig når du oppretter en rask og dirty test: legge et klikk hendelse lytteren på scenen for å kalle oppdateringen vil generere flere oppdateringer enn virkelig trengs, men når målet ditt er bare å sørge for at oppdateringen rutine er kalt til å teste koden din, kan dette være en tidsbesparende .



Trinn 5: Demo Interface Show Anchors Markerings

Jeg antar at du har forstått hvordan det fungerer, så de neste trinnene vil høres veldig kjent: vi vil fortsette å legge hendelsen lyttere til endre /oppdatere hendelser av komponentene brukeren vil samhandle med
beskyttet funksjon onAddedToStage (evt: Hendelses):. void {//... //Forrige code fortsatt her //... chkShowAnchors.addEventListener (Event.CHANGE , onCheckBoxChange, falsk, 0, true); createCircularText ();}



Trinn 6: Demo Interface Radius Slider

Lytte for oppdateringen av glideren vil fungere som sjekkboksene, men vi vil også oppdatere Label Innhold å vise verdien til brukeren, til å redigere teksten på etiketten viser slideren verdi
beskyttet funksjon onAddedToStage (evt: Hendelses):. void {//... //Forrige code fortsatt her //... sliderRadius.addEventListener (SliderEvent.CHANGE , onRadiusChange, falsk, 0, true); createCircularText ();} beskyttet funksjon onRadiusChange (evt: SliderEvent): void {labelRadius.text = "Radius:" + sliderRadius.value; createCircularText ();}



Trinn 7:. Demo Interface Tekst Offset Slider

Selvfølgelig er dette nesten den samme historien som radius, men med en annen etikett og en annen slider
beskyttet funksjon onAddedToStage (evt: Hendelses): void {//... //Forrige code fortsatt her //... sliderCharOffset.addEventListener (SliderEvent.CHANGE, onCharOffsetChange, falsk, 0, true); createCircularText ();} beskyttet funksjon onCharOffsetChange (evt: SliderEvent): void {labelOffset.text = "Character forskjøvet fra sirkelen:" + sliderCharOffset.value; createCircularText ();}



Trinn 8: Demo Interface generere Circle

Akkurat nå har vi gjort alt arbeidet for å sikre at createCircularText rutine kalles hver gang noe har endret seg, for å skape tekst sirkel. Nå er det på tide å lage teksten sirkelen i denne rutinen.

For å forandre teksten, vil vi kalle CircularText.generateText (templateTextField, targetHostClip, opsjoner), med alle alternativene blir lagret i en CircularTextOptions eksempel. Den indre arbeider av disse klassene vil være spørsmål om de neste trinnene, akkurat nå har vi å lese verdier fra våre komponenter og sende dem til disse objektene som vil gjøre jobben for oss. Disse klassene vil bli lagret i utils.clips pakke, så vi må sørge for at vi legger dette innholdet i import uttalelser

Vi trenger en klipp der du vil plassere sirkelen av individuelle karakter movieclips.; Dette vil bli kalt animHost.
pakken {//.... //Forrige import her fortsatt import utils.clips. *; //for klassene vi vil senere lage public class CircularTextTest strekker MovieClip {/** Den MovieClip som vil "vert" alle de opprettede karakter klipp * /public Var animHost: MovieClip; beskyttet funksjon createCircularText (): void {//For hensikten med demonstrasjonen skaper vi en MovieClip i sentrum av scenen if (animHost == null) {animHost = new MovieClip (); animHost.x = 275; animHost.y = 200; addChild (animHost); } Else {//Vi sørger for at de tidligere karakter klippene er fjernet for (var i: int = animHost.numChildren; i > 0; I--) {animHost.removeChildAt (0); }} Var alternativer: CircularTextOptions = nye CircularTextOptions (); if (chkTxtOutside.selected) {options.characterOrientation = CircularTextOptions.CHARACTER_ORIENTATION_OUTSIDE; } Else {options.characterOrientation = CircularTextOptions.CHARACTER_ORIENTATION_INSIDE; } Options.radius = sliderRadius.value; options.radiusOffset = sliderCharOffset.value; options.trimWhite = chkTrimWhite.selected; options.showAnchors = chkShowAnchors.selected; CircularText.generateText (tfTemplate, animHost, opsjoner); }



Trinn 9: Demo Interface Turning Circle

For å fullføre demoen, la oss gjøre sirkelen sving! For å gjøre dette trenger vi bare å lage en Timer objekt, gjør det tick 25 ganger i sekundet, og kaller en oppdatering handler hver gang den gjør det. Oppdateringsfunksjonen bare intervaller sirkelen mange MovieClip rotasjon eiendom med et lite beløp. Det er det - du har gjort det slår
pakken {//.... //Forrige import her fortsatt import flash.events.TimerEvent;. import flash.utils.Timer; public class CircularTextTest strekker MovieClip {/** En Timer objekt å kalle en oppdatering tilbakeringing og spinne sirkelen * /beskyttet Var rotationTimer: Timer; beskyttet funksjon createCircularText (): void {//... //Forrige code fortsatt her //Vi lager en tidtaker for å slå MovieClip if (rotationTimer == null) {rotationTimer = new Timer (1/25, 0); rotationTimer.addEventListener (TimerEvent.TIMER, onTimer, falsk, 0, true); rotationTimer.start (); }} Beskyttet funksjon onTimer (event: Timerevent): void {animHost.rotation + = 0,1; }



Trinn 10: Hoved Kode Linear posisjon for å Angle

Vi vil nå konvertere en lineær stilling til en vinkel. Vi vil vite den lineære x plasseringen av teksten, og vi trenger å transformere dette til en stilling på en sirkel. For å konvertere et punkt på et segment til et punkt på en sirkel, trenger vi et par ting:

Den segmentstørrelse, som vil være malen Textfield bredde. La oss kalle dette xMax
.

  • Den x posisjon på segmentet, som vil være den tegnposisjon i malen.
  • Sirkelen radius, som vi vil sette.

    alpha
    vinkel å plotte punkt på sirkelen. Denne vinkelen vil bli beregnet fra X og segmentstørrelsen. Vi vil vurdere å legge en fase
    , som er en forskyvning

    For å gjøre ting enkelt. Når x blir 0, vil alpha også være 0. På den andre siden når x lik xMax, deretter alpha = 360 ° (eller i radianer: 2 * PI)

    For alle de mellomstillinger, alpha = 2 * PI * x /xMax product: (i radianer)..

    Vi trenger denne verdien både i radianer - fordi tak i Math.sin () og Math.cos () ber om det - og i grader - fordi vi er nødt til å slå vår MovieClip å gjøre karakteren 'look' i sentrum, og MovieClip rotasjoner i grader. Men vi vil komme tilbake til dette i neste del.

    Hvis vi velger å legge en offset (eller en fase, på det er ofte kalt for vinkelverdier), så er det bare et enkelt tillegg til å gjøre.

    Til slutt, for å få posisjonen til tegnet på sirkelen fra sitt sentrum, er det helt grunnleggende trigonometri:
    clip.x = radius * Math.cos (angleInRadians); clip.y = radius * Math .sin (angleInRadians);



    Trinn 11: Hoved Kode vanlig fallgruve

    La oss se på en vanlig fallgruve i å få tegnet posisjoner. Den mest åpenbare verdier som kommer til tankene for xMax er å bruke antall tegn i teksten, og for x, for å bruke gjeldende tegn posisjon. Men dette er virkelig over-forenklet og vil føre oss til uestetisk resultater. Hvis du bruker en monospace font, vil det være greit. Men hvis du bruker en mer vanlig skrift, så forskyvningen mellom to påfølgende verdier av x vil alltid være den samme, enten tegnet er en liten en som en prikk eller en bred en som w. Dette betyr at enten noen bokstaver vil bli klemt sammen eller noen bokstaver vil bli spredt svært langt fra hverandre.

    Hvis vår kilde Textfield har kompleks tekstformatering, blande ulike fonter og skriftstørrelser, blir det tydelig at det tiende tegnet ut 20 vil nesten aldri være i sentrum av Textfield



    Trinn 12:. Hoved Kode Mellomrom og formatering

    Vi kommer til å bruke tegngrensene for å ta vare på tegnavstand og tekstformatering

    Action gir oss de sourceTf.getBounds (sourceTf.parent).; metode for å få de nøyaktige dimensjonene på Textfield (denne metoden er tilgjengelig for alle Displayobject). Den getBounds metoden krever et mål å koordinere plass. Den mest vanlige bruken av vår transformasjon vil være å lage sirkelen på samme nivå som mal Textfield, så vi vil bruke malen Textfield ordnede koordinere plass til å ta seg av eventuelle høyere nivå transformasjoner.

    Bruke tegnposisjon i kildestreng er for begrenset, så vi vil ikke bruke et slikt grunnleggende tiltak. Vi vil kalle sourceTextField.getCharBoundaries (nthCharacter) for å få den posisjonen og størrelsen på alle tegn. Dette vil returnere et rektangel, slik at vi vet bredden av tegnet, og den nøyaktige posisjon.

    Vi ønsker kanskje å trimme den ekstra hvite området før og etter den virkelige teksten, slik at du kan bruke et bredt dynamisk Textfield, men bare beregne virkelig brukt tekst bredde til å plassere tegnene på sirkelen uten ekstra hvit rom. For å gjøre dette, vil vi ha for å få den faktiske posisjonen til den første og siste tegn. Det er en påminnelse: Hvis du prøver å få grensene for en kontroll karakter, som linjeskift, vil den returnere null. Derfor vil vi sløyfe de nyeste tegn for å finne den siste som har grenser:
    Var i: int; Var charCnt: int = sourceTf.length; Var charBounds: rektangel; //Standard 'kilde' grensene er de whold textfields boundsvar templateBounds: Rektangel = sourceTf.getBounds (sourceTf.parent); //Hvis vi trimme "ekstra" hvit, så grensene for den siste synlige characterif (options.trimWhite) {charBounds = sourceTf.getCharBoundaries (0); templateBounds.left = charBounds.left; charBounds = null; i = 1; gjøre {charBounds = sourceTf.getCharBoundaries (sourceTf.length-i); i ++; } Stund (charBounds == null); templateBounds.right = charBounds.right;}

    Etter denne koden blokken vil templateBounds variable har ønsket bredde (som vi vil se senere, er option.trimWhite en boolsk, angi om vi ignorerer den ekstra hvite området av Textfield ).

    Vi har nå en riktig xMax verdi, og jeg antar at du har forstått at vi vil bruke den samme getCharBoundaries metode for å få nøyaktig x posisjonen til hver karakter i kildeTextField, noe som gir oss x-verdiene å bruke i våre formler ovenfor



    Trinn 13:. Hoved Kode Formatering våre Parametere

    Før du går videre i koding, vil vi formal alternativene vil vi håndtere, og sette dem alle i en parameter klasse. Vi vil bruke denne "alternativer container" i de neste trinnene for enkelt å dekke forskjellige varianter av sirkel transformasjon. Dette alternativet klasse kan være en enkel generisk Object, men ved hjelp av forhåndsdefinerte konstanter og verdier som gjør bruken av CircularText klasse enklere, gjør sterk typing - derfor gjør det lettere å finne feil ved kompilering - og gjør oss i stand til å sette standardverdier.
    pakke utils.clips {public class CircularTextOptions {statisk offentlig konst CHARACTER_ORIENTATION_INSIDE: Number = 90; statisk offentlig konst CHARACTER_ORIENTATION_OUTSIDE: Number = -90; /** Radius i sirkelen * /public Var radius: Nummer = 100; /** Vinkelavvik å gjelde (for å gjøre teksten spinne rundt sirkelen * /public Var fase: Antall = 0; /** Character orientering, kan være * CircularTextOptions.CHARACTER_ORIENTATION_INSIDE eller * CircularTextOptions.CHARACTER_ORIENTATION_OUTSIDE * /public Var characterOrientation: Antall = CHARACTER_ORIENTATION_INSIDE; /** Nyttig for debugging, dette alternativet gjør at visning av * karakter ankerpunktene (kan bidra til å finjustere offests, ...) * /public Var showAnchors: Boolean = false; /** Offset i pixel fra sirkelen til karakteren Ved å sette både * radius og dette offset, kan du kontrollere avstanden tegnet * /public Var radiusOffset:.. Antall = 0; /** Dette alternativet angir om sirkelen er basert på med av . kilde * Textfield eller bredden av innholdet ('white space "tegn * er fortsatt beregnet, dette er ikke en condenseWhite lignende opsjon) * /public Var trimWhite: Boolean = true; offentlig funksjon CircularTextOptions () {}}} < hr>
    Trinn 14: Hoved Kode karakter plassering

    Vi har allerede gått gjennom regnestykket til å konvertere en posisjon på x-aksen til en posisjon på sirkelen. Nå vil vi skape nye movieclips for hver karakter og plassere enhver etter sin x posisjon, og sette tekstformatering å matche kildeformatet og reprodusere samme utseende.

    Vi trenger noen lokale variabler til å lagre de mellomliggende verdier:
    Var grader: Antall; Var radianer: nummer, Div charContainer: MovieClip; Var radius: Number = options.radius;

    Så vi starter looping gjennom alle kilde tegn
    for (i = 0; i < charCnt; i ++) {charBounds = sourceTf.getCharBoundaries (i); if (charBounds! = null) //spesialtegn, som linjeskift, ikke har grenser, derfor denne testen {//...}}

    Ettersom dette tekstutdraget forteller deg, enkelte tegn ikke har grenser, så vi må ta vare på dem. Vi trenger ikke å vise usynlige tegn.



    Trinn 15: Hoved Kode Character Orientering

    Før du konverterer den opprinnelige x til sin vinkelposisjon, må vi ta vare på karakteren orientering: hvis karakter vil se "innsiden" sirkelen, så vinkelen vokse med x-verdien. Hvis vi bestemmer oss for å gjøre figurene ser til "utenfor" av sirkelen, så det vil bli lest som med et speil, og vi trenger å snu vinkelen vekst, ellers ville det ikke egentlig være lesbar.

    Hvis teksten er ute "innsiden", vil vi arrangere tegnene klokken. Hvis teksten er vendt "utenfor", må vi slå mot klokken mens plassere tegnene

    Hvis dette er fortsatt ikke klart, bare endre minus i options.phase -. (CharBounds.right - 0.5 * charBounds.width) * 360 /templateBounds.width til et pluss og publisere den for å se umiddelbart hvordan det ville sett ut hvis du ikke tar vare på karakteren orientering. Endelig konverterer vi de grader til radianer, som sin () og cos () trenger vinkler i radianer for sine argumenter.
    //Beregn vinkelforskyvningen av røye basert på sin metricsif (options.characterOrientation == CircularTextOptions.CHARACTER_ORIENTATION_INSIDE ) {grader = options.phase + (charBounds.left + 0,5 * charBounds.width) * 360 /templateBounds.width;} else {grader = options.phase - (charBounds.right - 0.5 * charBounds.width) * 360 /templateBounds .width;} radianer = grader * (Math.PI /180);

    Nå kan vi lage beholderen for karakteren og plassere det i vår vert, å ta vare på den vinkelen vi nettopp har beregnet:
    charContainer = ny MovieClip (); if (options.characterOrientation == CircularTextOptions.CHARACTER_ORIENTATION_INSIDE) {charContainer.rotation = Math.round (grader) + options.characterOrientation; charContainer.x = radius * Math.cos (radianer); charContainer.y = radius * tak i Math.sin (radianer);} else {charContainer.rotation = Math.round (grader) + options.characterOrientation; charContainer.x = radius * Math.cos (radianer); charContainer.y = radius * tak i Math.sin (radianer);} host.addChild (charContainer);

    Husk at characterOrientation verdien vil være ett av disse numrene, så options.characterOrientation brukt her vil slå karakter, noe som gjør det møte ønsket retning uten tilleggsberegninger:
    offentlig klasse CircularTextOptions {statisk offentlig konst CHARACTER_ORIENTATION_INSIDE: Number = 90; statisk offentlig konst CHARACTER_ORIENTATION_OUTSIDE: Number = -90;



    Trinn 16: Hoved Kode Formatering

    Nå som vi har opprettet en MovieClip vert for denne karakteren, plasserte den langs sirkelen og vri den i riktig retning, bør vi sette noe i det, som en Textfield med karakter, ellers ingenting ville være synlig;-)

    Dette er ganske grunnleggende: opprette en ny Textfield, og sette alle sine attributter. Det viktigste er å bruke embedFonts, slik at teksten vil fremdeles være synlig etter å ha blitt rotert
    //Set Tekst og TextFormatnewTf = new Textfield ();. NewTf.type = TextFieldType.DYNAMIC; newTf.selectable = false; newTf.embedFonts = true; newTf.autoSize = TextFieldAutoSize.CENTER; newTf.antiAliasType = AntiAliasType.NORMAL; newTf.text = sourceTf.text.charAt (i);

    Vi har en Textfield med teksten i det, nå er vi må formatere denne teksten å ser ut som den originale. Vi vil bruke en prøve /fangst til deformere setTextFormat fordi hvis noe går galt i tekstformatering, på grunn av manglende skrifttyper, vil feilen dukker opp her, og dette vil hjelpe deg å feilsøke skriftproblemer.
    CharTf = sourceTf. getTextFormat (i); try {newTf.setTextFormat (charTf);} catch (e: Feil) {trace ("tekstformat error '); //sted et stoppunkt her for å se etter potensielle skriftproblemer ...}

    Til slutt vi har å sentrere Textfield inn i målet MovieClip vi opprettet i forrige trinn, for å sørge for at de ser justert på sirkelen. Den radiusOffset parameter vi bruker her fullføre sirkelen radius: når finjustere utseendet på sirkulær tekst, har både sirkelen radius - som satt der karakter beholderne er - og en forskyvning gjøre det enklere å stille inn tegnavstand ønsket. Det kan være helt gjort uten denne offset, men gjør livet lettere for noen designer som arbeider med våre snutter Anmeldelser newTf.x = -. (CharBounds.width) /2;newTf.y = - (charBounds.height) + alternativer. radiusOffset;

    Det er det, er vi ferdige. Vi har gått gjennom alle trinnene, og nå har en fullt fungerende rutine



    Trinn 17:. Hoved Kode klasse så langt

    Og her kommer komplett CircularText klassen vi har bygget hele trinnene i denne opplæringen:
    pakken utils.clips {import fl.text.TLFTextField; import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Rectangle; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFieldType; import flash.text.TextFormat; import flash.text.AntiAliasType; import flash.text.Font; /** * Bruk CircularText.generateText (templateTextfield, targetMovieClip, * opsjoner) for å skape et godt linjeavstand karakter distribusjon rundt en sirkel * i målet MovieClip. * /Public class CircularText {offentlig funksjon CircularText () {} /** *param sourceTf tekstfeltet wich er brukt som kilde og mal. * Typisk en dynamix Textfield, invivisible, der * teksten og tekstformat er satt av resten av * program. *param Vert Målet MovieClip der teksten sirkelen vil * bli opprettet. *param Alternativene A CircularTextOptions objekt med formateringsvalg * for å gjøre teksten sirkel ser ut som vi vil. * /Statisk offentlig funksjon generateText (sourceTf: Textfield, host: MovieClip, alternativer: CircularTextOptions = null): void {if (valg == null) alternativer = nye CircularTextOptions (); //Vi eksplodere den opprinnelige tekstfeltet i mindre klipp, hver og en som inneholder en karakter Var newTf: Textfield; Var charTf: tekstformat; Var i: int; Var charCnt: int = sourceTf.length; Var charBounds: Rektangel; //Standard 'kilde' grensene er de whold textfields grensene Var templateBounds: Rektangel = sourceTf.getBounds (sourceTf.parent); //Hvis vi trimme "ekstra" hvit, så grensene for den siste synlige tegn if (options.trimWhite) {charBounds = sourceTf.getCharBoundaries (0); templateBounds.left = charBounds.left; charBounds = null; i = 1; gjøre {charBounds = sourceTf.getCharBoundaries (sourceTf.length-i); i ++; } Stund (charBounds == null); //Ta vare på null-boundareis karakter som linjeskift templateBounds.right = charBounds.right; } Var grader: Number; Var radianer: Number; Var charContainer: MovieClip; Var radius: Number = options.radius; for (i = 0; i < charCnt; i ++) {charBounds = sourceTf.getCharBoundaries (i); if (charBounds! = null) //spesialtegn, som linjeskift, ikke har grenser, derfor denne testen {//Beregn vinkelforskyvningen av røye basert på sine beregninger if (options.characterOrientation == CircularTextOptions.CHARACTER_ORIENTATION_INSIDE) { grader = options.phase + (charBounds.left + 0,5 * charBounds.width) * 360 /templateBounds.width; } else {grader = options.phase - (charBounds.right - 0,5 * charBounds.width) * 360 /templateBounds.width; } Radianer = grader * (Math.PI /180); //Opprett en ny tekstfeltet til å gjengi dette tegnet newTf = new Textfield (); charTf = sourceTf.getTextFormat (i); //Set Tekst og tekstformat newTf.type = TextFieldType.DYNAMIC; newTf.selectable = false; newTf.embedFonts = true; newTf.autoSize = TextFieldAutoSize.CENTER; newTf.antiAliasType = AntiAliasType.NORMAL; newTf.text = sourceTf.text.charAt (i); try {newTf.setTextFormat (charTf); } Catch (e: Feil) {trace ("tekstformat error '); //sted et stoppunkt her for å se etter potensielle skriftproblemer ...} newTf.x = - (charBounds.width) /2; newTf.y = - (charBounds.height) + options.radiusOffset; charContainer = new MovieClip (); if (options.showAnchors) {//her kommer det grafiske aspektet av ankrene, hvis du vil ha noe annet charContainer.graphics.beginFill (0xff00ff, 1); charContainer.graphics.drawRect (0,0,5,5); charContainer.graphics.endFill (); } CharContainer.addChild (newTf); if (options.characterOrientation == CircularTextOptions.CHARACTER_ORIENTATION_INSIDE) {charContainer.rotation = Math.round (grader) + options.characterOrientation; charContainer.x = radius * Math.cos (radianer); charContainer.y = radius * tak i Math.sin (radianer); } Else {charContainer.rotation = Math.round (grader) + options.characterOrientation; charContainer.x = radius * Math.cos (radianer); charContainer.y = radius * tak i Math.sin (radianer); } Host.addChild (charContainer); }}}}}



    Trinn 18: Hoved Kode Påfør Transformation

    Vi har sett alle deler, og sette dem sammen i et verktøy klasse. . Nå har vi bare å kalle denne metoden for å generere en sirkulær visning av Textfield
    //tfTemplate er Textfield inneholder kildeteksten for å forvandle //animHost er en MovieClip hvor vi vil skape circlevar alternativer: CircularTextOptions = new CircularTextOptions (); options.characterOrientation = CircularTextOptions.CHARACTER_ORIENTATION_INSIDE; options.radius = 50; options.radiusOffset = 0; options.trimWhite = true; options.showAnchors = false; CircularText.generateText (tfTemplate, animHost, opsjoner);

    Betyr denne koden ser ut som noe du allerede har sett? Vel det skal, fordi dette utvalget bruken er veldig nær createCircularText metoden vi bygget på begynnelsen. Nå kan du se at nesten alt er på plass



    Trinn 19:. Hoved Kode A Simple Demo

    Nå som all koden er fullført, kan du kompilere demoen vi har bygget i de første trinnene (eller åpne det fra de nedlastbare kilder).

    For de som hoppet over første delen, er koden i demoen helt grunnleggende: enkle lyttere til å oppdatere den sirkulære tekst når noe er endret. Takk for lesing!