Tegning Vakre Components Med Code

Drawing Vakre komponenter Med Code - Made Easy
Del
Del
Del
Del

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

De fleste programmerere har aldri rørt design. Hvis du alltid har ønsket å vakker grafikk i Flash-prosjekter, men aldri visste hvordan du bruker Adobe Photoshop eller Illustrator, er denne opplæringen for deg. Fin grafikk kan lages helt med kode. Tegning grafikk for komponenter med kode selv har noen fordeler.

Forutsetninger

Denne opplæringen forutsetter at du vet hvordan du skal utføre grunnleggende tweens hjelp Greensock sin TweenLite eller TweenMax. Du kan laste ned den nyeste versjonen av TweenLite fra Greensock nettside. Jeg skal bruke Flash CS5 Professional til å fullføre dette prosjektet. Du kan bruke hvilken som helst Flash IDE du ønsker (for eksempel FlashDevelop eller FDT). Det vil også hjelpe å ha en god forståelse av arv.

En kort introduksjon

Før vi kommer i gang, la oss ta en titt på hva vi skal lære og hvorfor det er viktig. Ved utforming Flash-applikasjoner er det mange måter å generere grafikk. Du kan bruke et eksternt verktøy som Adobe Illustrator eller tegne komplekse grafikk med Adobe Photoshop. Du kan også bruke 3D-verktøy som for eksempel Cinema 4D for å skape oppsiktsvekkende 3D bitmaps å importere til Flash. Disse teknikkene er stor for å skape et godt designet statisk Anmeldelser søknad - statisk
betyr ikke veldig dynamisk
, eller i de fleste tilfeller, ikke dynamisk i det hele tatt
.

Hvis du bruker en av de ovennevnte metoder for å generere grafikk for Flash, kan du finne det litt vanskelig å endre størrelsen på grafikk uten noe tap av kvalitet eller, enda verre, forvrengning. På solsiden, kan du importere en vektor fil som ble generert med Adobe Illustrator inn din Flash søknad og skalere bildet uendelig uten å forvrenge bildet - men når du ønsker å endre det generelle forholdet mellom bildet, vil du legge merke til at bildet blir litt deformert.

Hva vi skal gjøre i dag er å lære hvordan effektiv det kan være å trekke søknaden vår grafikk med kode. Vi kommer til å lage en vakker animert knapp som er fullstendig generert med Action

Trinn 1:. Fordeler og ulemper

Før vi graver i, vil jeg gjerne diskutere betydningen av planlegging for din søknad og svare på enkle spørsmål for å avgjøre om å tegne grafikken med kode eller for hånd (f.eks med Adobe Photoshop). For å hjelpe oss med å svare på spørsmålene nedenfor, la oss først undersøke fordeler og ulemper å tegne med kode

Argumenter

bærbarhet:. Grafikk som er skrevet i kode er enkelt å importere inn andre prosjekter siden de eksisterer som AS filer. Du trenger ikke å kopiere og lime inn et bilde i en ny Flash prosjekt eller importerer bildet inn i biblioteket. Bare importere de aktuelle klassene

Simplicity:.. Graphics trukket med kode er gjort ved hjelp av vektorer slik at de har en delikat og forenklede følelse som er både fin å se på og lys på CPU

Konsistens : Når du ønsker å endre størrelsen på grafikken, de vil ikke forvrenge (med mindre dette er effekten du går for), og de vil opprettholde kvalitet som er skalert. Bitmap-bilder, for eksempel, blir kornete som de er laget større eller zoomet inn. Vektor bilder ikke mister noe kvalitet eller bli kornete. Du kan zoome inn i en vektor bilde infinately og det vil aldri miste kvalitet. Du kan også være sikker på at grafikken fortsatt ser fantastisk på skjermer med høyere oppløsninger. Som teknologiutviklingen og nye skjermoppløsninger blir tilgjengelige, grafikken er mer sannsynlig å fortsatt være i stand til å levere en fin kvalitet, i motsetning til bitmap bilder som kanskje ikke ser så bra

Dynamics. Sammen med å være i stand til å endre størrelse og skalere grafikk, kan du også re-farge segmenter av et bilde eller komponent med svært få linjer med kode. Endre egenskapene til en grafisk har aldri vært så enkelt. Hva er det du sier? Du ikke lenger vil rammen av tekstfeltet å ha avrundede kanter? Ikke noe problem her. Jeg vil bare endre en linje med kode ... og vi er godt å gå

Precision: Selv om mange grafikkprogrammer har funksjoner som forenkler plassering av grafiske segmenter, vil du finne det lettere å gjøre modifikasjoner og posisjon innholdet i en grafisk med kode. Du kan enkelt sentrere ett segment inne i et annet som forelder segmentet endringer størrelse eller skrive en algoritme for håndtering av hvordan et segment vil bli vist som det er endret. . Hint, hint

De Cons

Detalj: vektorgrafikk trukket med koden kan være svært detaljert, men for mye detaljer kan ha en dramatisk effekt på resultatene av vår applikasjoner. Selv om det kan være mulig, vil du ikke finne meg forsøker å tegne et detaljert Spongebob Squarepants med kode. Noe sånt som bør gjøres ved hjelp av Adobe Illustrator. Også vektorer kan ikke være i stand til å være så detaljert som en kompleks grafisk tegnet i Adobe Photoshop. Vektorer har en tendens til å inneholde en mindre filstørrelse enn vanlig punktgrafikkbilde. Vektorer er forbundne punkter og punktgrafikk er representert piksel for piksel. Men hvis du har konvertert et bitmap i en vektor bilde, ville den nye vektoren filstørrelsen vise seg å være mye større enn den opprinnelige punktgrafikkbilde. Dette er sagt, vil du ikke være i stand til å male et intrikat portrett med kode. Bruk Adobe Photoshop i stedet

Begrensninger. Det kan være tider der du ønsker å bruke grafikk i ulike medier. Beklager å si det, men hvis du ikke vil være i stand til å slippe dynamiske grafikk til at Java spill du har jobbet med, eller at Objective-C programmet du nettopp startet. Det finnes måter å gjengi bilder med Flash, men du vil definitivt miste noen dynamiske kapabiliteter som tilbys av kode

en. Ikke for å si at du vil finne det latterlig vanskelig å trekke grafikk med kode, men avhengig av hva du tegner , vil du mest sannsynlig finne hele prosessen litt mer komplisert enn å bruke en programvare som er beregnet for dette formålet. Ikke forvent å tegne med kode for å være en lett oppgave. Det virkelig an på det forventede resultatet.

Du skal nå finne følgende spørsmål ganske enkle å besvare. Det er tre spørsmål du må stille deg selv før du starter prosjektet:

Har din søknad krever grafikk å være statisk eller dynamisk

Statisk

Dynamic

Har grafikken eller komponenter i søknaden din trenger å være eksklusiv til Flash eller være konsekvent på tvers av flere plattformer?

Flash Platform bare

flere plattformer

Er grafisk design av søknaden din mer detaljert eller ganske enkelt?

relativt enkle (geometriske grunnformer)

Moderat (Creative design med enkle figurer)

Intrikate (uoversiktlig mesterverk)

Nå undersøke testresultater. Dersom testresultatene likne resultatene tett under, enn de teknikkene vi får klar til å lære er for deg?

  • # 2

    # 1

    # 1 og # 2

    Hvis resultatene ikke
    ligne resultatene ovenfor, kan det være lurt å vurdere andre metoder. Men for resten av oss, la oss fortsette

    Trinn 2:. Idédugnad

    Så her er scenariet. En klient har nettopp bedt oss om å lage en animert knappen for deres Flash-området og AIR app. Knappen må være i samsvar med science fiction temaet på kundens nettsted. Knappen høyde kan være en fast størrelse, men den knappen må være i stand til å imøtekomme for forskjellige bredder. Knappen må ha en vippe stat som har en åpenbar forskjell mellom det aktive og inaktive stater. Endelig knappen må ha en API som er lett å jobbe med.

    Nå som vi vet at vi har fått dette tema komponent for å lage, må vi tenke på hvordan vi skal gå om å lage den. Vel, vi vet at vi kommer til å bli tegnet mye av grafikk med kode slik at komponenten vil være enkelt og effektivt redigerbare. Hvorfor ikke begynne med en base klasse som vil legge høy funksjonalitet oppå Flash tegning API?

    Vi ønsker ikke å tegne grafikk igjen og igjen ved å skrive de samme linjer med kode, slik at vi får en klasse med spesielle egenskaper og metoder er spesielt utviklet for gjenbruk av kode for oss. Vi vil utvide denne klassen for å skape de viktigste figurene som vi trenger for vår knappen

    Trinn 3:. Den Redigerbar Shape Class

    Nå er det tid for å få til det! Opprett en ny klasse kalt EditableShape og legge til følgende klasser til klassebanen
    import flash.display.Graphics;. Import flash.display.Sprite, import flash.events.Event, import flash.geom.Matrix; import flash.display .BitmapData, import flash.utils.getDefinitionByName, import flash.utils.getQualifiedClassName;

    Nå opprette klassen erklæringen. Klassen bør forlenge flash.display.Sprite klassen
    public class EditableShape strekker Sprite {

    Opprett følgende variabler (egenskaper) før klassen konstruktør
    privat Var _fillGradientType:.. String; privat Var _fillSpreadMethod: String; private Var _fillColors: Array, private Var _fillAlphas: Array, private Var _fillRatios: Array, privat Var _fillGradientWidth: nummer, private Var _fillGradientHeight: Number; private Var _fillGradientRotation: nummer, private Var _fillTx: nummer, private Var _fillTy: nummer, private Var _lineGradientType: String; private Var _lineSpreadMethod: String; private Var _lineThickness: Number; private Var _lineColors: Array, private Var _lineAlphas: Array, private Var _lineRatios: Array, private Var _lineGradientWidth: Number; private Var _lineGradientHeight: Number; private Var _lineGradientRotation : Number; private Var _lineTx: Number; private Var _lineTy: Number; private Var _width: Number; private Var _height: Number; private Var _matchGradientSize: Boolean, private Var _bitmapData: BitmapData; private Var _useBitmapFill: Boolean, private Var _pixelHinting: Boolean; beskyttet Var fillGradientBox: Matrix, beskyttet Var lineGradientBox: Matrix;

    Innenfor klassen konstruktør legge til følgende kode og jeg skal forklare hva vi nettopp gjorde
    super (); _ width = 100; _height = 100; _matchGradientSize. = true; _fillGradientType = "lineær"; _ fillSpreadMethod = "pad"; _ fillColors = [0xFFFFFF, 0x000000]; _ fillAlphas = [1, 1]; _ fillRatios = [1, 255]; _ fillGradientWidth = _width; _fillGradientHeight = _height; _fillGradientRotation = 0; _fillTx = 0; _fillTy = 0; _lineGradientType = "lineær"; _ lineSpreadMethod = "pad"; _ lineThickness = 0,1; _lineColors = [0xFFFFFF, 0x000000]; _ lineAlphas = [1, 1]; _ lineRatios = [1, 255]; _lineGradientWidth = _width; _lineGradientHeight = _height; _lineGradientRotation = 0; _lineTx = 0; _lineTy = 0; _useBitmapFill = false; _pixelHinting = true; fillGradientBox = new Matrix (); lineGradientBox = new Matrix (); init ();

    Hovedfunksjonen til konstruktøren er på å bruke alle de egenskaper som vi har definert. Vi ga også hver eiendom en standardverdi. Du vil være i stand til å se hva resultatet av disse verdiene er senere. Hver eiendom som begynner med en understrekning vil bli gitt lese- /skrivetilgang til utenfor kode. Årsakene disse egenskapene ikke er offentlige properites er fordi vi ønsker å svare på endringen i verdien av hver enkelt eiendom. Vi skal gjøre dette innenfor de Setter
    metoder som vi skal lage senere.

    Hver eiendom er basert på spesiell verdi som må bestås inn i noen av grafikkobjekter metoder. Et eksempel er _fillGradientColors egenskapen. Det er en rekke uints som vil bli sendt inn i det graphics.beginGradientFill metoden. Et annet eksempel er _pixelHinting egenskapen. Det vil bli ført inn i graphics.lineStyle metodens pixelHinting parameter.

    Den siste linjen i constuctor kaller init-metoden. Init metoden er svært enkel. Det kaller oppdateringen metoden

    Trinn 4:. Oppdaterings Method

    Oppdateringen metoden er trolig den viktigste metoden innenfor EditableShape klassen. Hovedmålet med denne metoden er å fjerne eventuelle eksisterende grafikk og tegne dem basert på de nyeste dataene. Vi vil kalle denne metoden hver gang en eiendom har endret seg slik at endringene kan sees umiddelbart av brukeren hvis nødvendig, anbefaler. Opprett oppdateringen metoden
    beskyttet funksjon oppdatering (). Void {if (_matchGradientSize) {_lineGradientWidth = _width; _lineGradientHeight = _height; _fillGradientWidth = _width; _fillGradientHeight = _height; } LineGradientBox.createGradientBox (lineGradientWidth, lineGradientHeight, toRadians (lineGradientRotation), lineTx, lineTy); fillGradientBox.createGradientBox (fillGradientWidth, fillGradientHeight, toRadians (fillGradientRotation), fillTx, fillTy); super.graphics.clear (); super.graphics.lineStyle (lineThickness, 0, 0, pixelHinting); super.graphics.lineGradientStyle (lineGradientType, lineColors, lineAlphas, lineRatios, lineGradientBox, lineSpreadMethod); hvis super.graphics.beginGradientFill (fillGradientType, fillColors, fillAlphas, fillRatios, fillGradientBox, fillSpreadMethod) ellers super.graphics.beginBitmapFill (_bitmapData) (_bitmapData || _useBitmapFill!); tegne ();}

    The Matrix stedene vi opprettet i konstruktøren brukes til å manipulere gradienter. Vi trengte to av dem. En for fyll gradient, og den andre for linjen gradient.

    Vi vil bli overstyrer få grafikk metode, slik at vi kan forby tilgang til denne eiendommen til utenfor kode. Vi vil ikke ha noen utenfor kode tukling med våre grafikk i det hele tatt. Fordi vi kommer til å overstyre få grafikk metoden, trenger vi å få tilgang til metoden fra underklassen. Dette oppnås gjennom den super objektet. Vi vil også lage en beskyttet metode som kalles getGraphics senere. Denne metoden er nødvendig for å gi underklasser tilgang til grafikkobjekter uten å gi tilgang til objektet til utenfor kode.

    I konklusjonen, er oppdateringen metoden re-initialiserer grafikken og det gjør dette basert på gjeldende verdier av eiendommer innenfor EditableShape eksempel. Den siste linjen med kode kaller uavgjort metode som er en abstrakt metode i EditableShape klassen. Metoden skal være overstyrt av en underklasse og er ment for å tegne en bestemt form ved hjelp av grafikkobjekter innenfor gjennomføringen

    Trinn 5:.. Clones og kopier

    Opprett trekningen metoden
    beskyttet funksjon draw (): void {//Abstract}

    Igjen trekningen metoden er bare en enkel abstrakt metode som vi kan ignorere for nå

    Vi må kopiere egenskapene til én form til en annen. . Det kan også hende at du ønsker en fullstendig klone av en bestemt form. Vi vil opprette to metoder for å oppnå dette for oss. Gjør du det vil spare oss for mye tid i det lange løp. I stedet for alltid omskrivninger koden vi skal bare ringe den aktuelle metoden som kopierer eller kloner en form. Lag kopi og klone metoder
    offentlig funksjon kopi (form: EditableShape):. Void {_width = shape.width; _height = shape.height; _matchGradientSize = shape.matchGradientSize; _fillGradientType = shape.fillGradientType; _fillSpreadMethod = shape.fillSpreadMethod; _fillColors = shape.fillColors; _fillAlphas = shape.fillAlphas; _fillRatios = shape.fillRatios; _fillGradientWidth = shape.fillGradientWidth; _fillGradientHeight = shape.fillGradientHeight; _fillGradientRotation = shape.fillGradientRotation; _fillTx = shape.fillTx; _fillTy = shape.fillTy; _lineGradientType = shape.lineGradientType; _lineSpreadMethod = shape.lineSpreadMethod; _lineThickness = shape.lineThickness; _lineColors = shape.lineColors; _lineAlphas = shape.lineAlphas; _lineRatios = shape.lineRatios; _lineGradientWidth = shape.lineGradientWidth; _lineGradientHeight = shape.lineGradientHeight; _lineGradientRotation = shape.lineGradientRotation; _lineTx = shape.lineTx; _lineTy = shape.lineTy; _useBitmapFill = shape.useBitmapFill; if (_bitmapData) _bitmapData = shape.bitmapData.clone (); if (filtre) filtre = shape.filters; alpha = shape.alpha; oppdatering ();} offentlig funksjon klone (): EditableShape {var c: Klasse = Klasse (getDefinitionByName (getQualifiedClassName (denne))); Var form: EditableShape = new c (); shape.width = _width; shape.height = _height; shape.matchGradientSize = _matchGradientSize; shape.fillGradientType = _fillGradientType; shape.fillSpreadMethod = _fillSpreadMethod; shape.fillColors = _fillColors; shape.fillAlphas = _fillAlphas; shape.fillRatios = _fillRatios; shape.fillGradientWidth = _fillGradientWidth; shape.fillGradientHeight = _fillGradientHeight; shape.fillGradientRotation = _fillGradientRotation; shape.fillTx = _fillTx; shape.fillTy = _fillTy; shape.lineGradientType = _lineGradientType; shape.lineSpreadMethod = _lineSpreadMethod; shape.lineThickness = _lineThickness; shape.lineColors = _lineColors; shape.lineAlphas = _lineAlphas; shape.lineRatios = _lineRatios; shape.lineGradientWidth = _lineGradientWidth; shape.lineGradientHeight = _lineGradientHeight; shape.lineGradientRotation = _lineGradientRotation; shape.lineTx = _lineTx; shape.lineTy = _lineTy; shape.useBitmapFill = _useBitmapFill; if (_bitmapData) shape.bitmapData = _bitmapData.clone (); shape.filters = filtre; shape.alpha = alpha; returnere form;.}

    kopieringsmetoden tar form parameter og setter alle egenskapene som tilsvarer antall gjeldende EditableShape

    Vi vil ikke bruke klonen metoden i denne opplæringen, men jeg bare kastet den inn som en ekstra bonus. Metoden returnerer en klonet kopi av gjeldende EditableShape klassen

    Trinn 6:. Etterbehandling opp EditableShape

    Det siste vi trenger å gjøre er tilskuddet lese /skrive-tilgang til alle figurens hoved egenskaper. Skriv følgende getter og setter-metoder innenfor EditableShape klassen
    offentlige styringsfunksjon satt bredde (verdi: Number):. Void {_width = verdi; oppdatering (); } Public override funksjonen get bredde (): Antall {return _width; } Public override funksjonen satt høyde (verdi: Number): void {_height = verdi; oppdatering (); } Public override funksjonen får høyde (): Antall {return _height; } Offentlig funksjon satt fillGradientType (verdi: String): void {switch (value.toLowerCase ()) {case "lineær": case "radial": _fillGradientType = value.toLowerCase (); oppdatering (); gå i stykker; Standard: //Gjør ingenting}} offentlig funksjon får fillGradientType (): String {return _fillGradientType; } Offentlig funksjon satt fillSpreadMethod (verdi: String): void {switch (value.toLowerCase ()) {case "pad»: case "reflektere": case "gjenta": _fillSpreadMethod = value.toLowerCase (); oppdatering (); Standard: //Gjør ingenting}} offentlig funksjon får fillSpreadMethod (): String {return _fillSpreadMethod; } Offentlig funksjon sett fillColors (matrise: Array): void {var a: Array = []; for hver (var farge: uint i array) {if (fargen er uint) {a.push (farge); }} _fillColors = En; oppdatering (); } Offentlig funksjon får fillColors (): Array {return _fillColors; } Offentlig funksjon satt fillAlphas (matrise: Array): void {var a: Array = []; for hver (var nAlpha: Nummer i array) {if (nAlpha er Number) {a.push (nAlpha); }} _fillAlphas = En; oppdatering (); } Offentlig funksjon får fillAlphas (): Array {return _fillAlphas; } Offentlig funksjon satt fillRatios (matrise: Array): void {var a: Array = []; for hver (var ratio: Nummer i array) {if (forholdet er int) {a.push (ratio); }} _fillRatios = En; oppdatering (); } Offentlig funksjon får fillRatios (): Array {return _fillRatios; } Offentlig funksjon satt fillGradientWidth (verdi: Number): void {_fillGradientWidth = verdi; oppdatering (); } Offentlig funksjon får fillGradientWidth (): Antall {return _fillGradientWidth; } Offentlig funksjon satt fillGradientHeight (verdi: Number): void {_fillGradientHeight = verdi; oppdatering (); } Offentlig funksjon får fillGradientHeight (): Antall {return _fillGradientHeight; } Offentlig funksjon satt fillGradientRotation (grader: Number): void {_fillGradientRotation = grader; oppdatering (); } Offentlig funksjon får fillGradientRotation (): Antall {return _fillGradientRotation; } Offentlig funksjon satt fillTx (verdi: Number): void {_fillTx = verdi; oppdatering (); } Offentlig funksjon får fillTx (): Antall {return _fillTx; } Offentlig funksjon satt fillTy (verdi: Number): void {_fillTy = verdi; oppdatering (); } Offentlig funksjon får fillTy (): Antall {return _fillTy; } Offentlig funksjon satt lineGradientType (verdi: String): void {switch (value.toLowerCase ()) {case "lineær": case "radial": _lineGradientType = value.toLowerCase (); oppdatering (); gå i stykker; standard: //Gjør ingenting}} offentlig funksjon får lineGradientType (): String {return _lineGradientType; } Offentlig funksjon satt lineSpreadMethod (verdi: String): void {switch (value.toLowerCase ()) {case "pad»: case "reflektere": case "gjenta": _lineSpreadMethod = value.toLowerCase (); oppdatering (); Standard: //Gjør ingenting}} offentlig funksjon får lineSpreadMethod (): String {return _lineSpreadMethod; } Offentlig funksjon satt lineThickness (verdi: Number): void {_lineThickness = verdi; oppdatering (); } Offentlig funksjon får lineThickness (): Antall {return _lineThickness; } Offentlig funksjon sett lineColors (matrise: Array): void {var a: Array = []; for hver (var farge: uint i array) {if (fargen er uint) {a.push (farge); }} _lineColors = Array; oppdatering (); } Offentlig funksjon får lineColors (): Array {return _lineColors; } Offentlig funksjon sett lineAlphas (matrise: Array): void {var a: Array = []; for hver (var nAlpha: Nummer i array) {if (nAlpha er Number) {a.push (nAlpha); }} _lineAlphas = En; oppdatering (); } Offentlig funksjon får lineAlphas (): Array {return _lineAlphas; } Offentlig funksjon sett lineRatios (matrise: Array): void {var a: Array = []; for hver (var ratio: Nummer i array) {if (forholdet er int) {a.push (ratio); }} _lineRatios = En; oppdatering (); } Offentlig funksjon får lineRatios (): Array {return _lineRatios; } Offentlig funksjon satt lineGradientWidth (verdi: Number): void {_lineGradientWidth = verdi; oppdatering (); } Offentlig funksjon får lineGradientWidth (): Antall {return _lineGradientWidth; } Offentlig funksjon satt lineGradientHeight (verdi: Number): void {_lineGradientHeight = verdi; oppdatering (); } Offentlig funksjon får lineGradientHeight (): Antall {return _lineGradientHeight; } Offentlig funksjon sett lineGradientRotation (grader: Number): void {_lineGradientRotation = grader; oppdatering (); } Offentlig funksjon får lineGradientRotation (): Antall {return _lineGradientRotation; } Offentlig funksjon satt lineTx (verdi: Number): void {_lineTx = verdi; oppdatering (); } Offentlig funksjon får lineTx (): Antall {return _lineTx; } Offentlig funksjon satt lineTy (verdi: Number): void {_lineTy = verdi; oppdatering (); } Offentlig funksjon får lineTy (): Antall {return _lineTy; } Offentlig funksjon satt matchGradientSize (verdi: Boolean): void {_matchGradientSize = verdi; oppdatering (); } Offentlig funksjon får matchGradientSize (): Boolean {return _matchGradientSize; } Offentlig funksjon satt bitmapData (verdi: BitmapData): void {_bitmapData = verdi; oppdatering (); } Offentlig funksjon får bitmapData (): BitmapData {return _bitmapData; } Offentlig funksjon satt useBitmapFill (verdi: Boolean): void {_useBitmapFill = verdi; oppdatering (); } Offentlig funksjon får useBitmapFill (): Boolean {return _useBitmapFill; } Offentlig funksjon satt firstFillColor (verdi: uint): void {_fillColors [0] = verdi; oppdatering (); } Offentlig funksjon får firstFillColor (): uint {if (_fillColors.length > 0) {return _fillColors [0]; } Else {return 0; }} Offentlig funksjon satt pixelHinting (verdi: Boolean): void {_pixelHinting = verdi; oppdatering (); } Offentlig funksjon får pixelHinting (): Boolean {return _pixelHinting; } Public override funksjonen får grafikk (): Grafikk {return null; } Beskyttet funksjons getGraphics (): Grafikk {return super.graphics; }

    Alle de getter metoder bare returnere den tilsvarende egenskaper verdi. Men for de setter-metoder vi korrigere eller filtrere ut uønsket innspill. Vi også ringe oppdateringen metode, slik at det er en umiddelbar reaksjon på den nye verdien eller verdiene

    Trinn 7:. Tegne rektangler

    De fleste av våre knappen vil bestå av rektangel figurer. Med mindre vi ønsker å bore våre kunders brukere med en haug med halt klumpete figurer, vil vi ønsker å være i stand til kantene for å runde av våre rektangler. Den EditableShape klassen er ment å bli forlenget, noe som betyr at den bør ha underklasser at sluttføre den primære funksjon av klassen. Den EditableShape klassen tar seg av alt det harde arbeidet for oss. Alt vi trenger å gjøre nå er å tegne formen innenfor en underklasse. Opprett en ny klasse kalt RectangleShape som forlenger EditableShape klassen. Klassen erklæring bør se slik
    public class RectangleShape strekker EditableShape {

    Legg til følgende private eiendommer til klassen rett etter klassen erklæring
    privat Var _ellipseWidth:.. Nummer, private Var _ellipseHeight: Number; < p> Jeg nevnte tidligere at vi skal avrunding kantene til våre rektangler. Som du sikkert har gjettet allerede, vi skal innvilge lese /skrivetilgang til disse egenskapene akkurat som vi gjorde med alle de andre nedarvede egenskaper. Dette vil gi oss mulighet til å reagere på noen endring de ellipseWidth og ellipseHeight egenskaper umiddelbart etter at de har blitt endret

    Påminnelse:.. Dette gjøres ved å ringe oppdateringsmetoden

    Lag klassen konstruktør. Gi _ellipseWidth og _ellipseHeight egenskaper en standardverdi på 0. Vi ønsker ikke kantene som skal avrundes som standard
    offentlig funksjon RectangleShape () {_ellipseWidth = 0.; _ellipseHeight = 0; super ();}

    Du bør huske trekningen metoden fra EditableShape klassen var en abstrakt metode. Dette er en metode som har en tom implementering. Vi kommer til å overstyre denne metoden for å gi den riktig funksjonalitet. Metodene Navnet er selvforklarende. Metoden vil gjøre selve tegningen av formen

    Viktig:.
    Vi kaller base klassen konstruktør, super (), etter at vi har fått en verdi til _ellipseWidth og _ellipseHeight egenskaper. Husk konstruktør initialiserer formen ved å ringe init-metoden som deretter kaller oppdateringen metode som endelig kaller trekningen metoden. Du vil se i et øyeblikk at trekningen metoden krever disse egenskapene. Forgeting å ringe konstruktøren sist vil resultere i et argument feil kastet av drawRoundRect metoden grafikkobjekter
    beskyttet styringsfunksjon draw ():.. Void {getGraphics () drawRoundRect (0, 0, bredde, høyde, _ellipseWidth, _ellipseHeight);}

    Jeg må si unnskyld til alle dere som har ventet ti eller flere linjer med kode her i trekningen metoden. Det er ikke tilfelle her. Husk at basen klasse (EditableShape) gjør mesteparten av jobben for oss. Den håndterer farger, graderinger, Alpha, linje egenskaper og så videre. Alt vi trengte å gjøre er å tegne formen og det er det vi har gjort. Grafikken objektet ikke lenger kan nås ved utenfor kode siden eiendommen har blitt overstyrt, så vi måtte få tilgang til den gjennom beskyttet metoden, getGraphics. Endelig kaller vi den drawRoundRect metoden på grafikken objekt og vi passerer i de aktuelle parametrene

    Trinn 8:. Deaktivere Kopier og Clone Metoder

    Det er to flere metoder vi trenger for å overstyre før vi kan konkludere denne klassen. Den første metoden er kopieringsmetoden. Dette er metoden fra EditableShape klassen som tar en EditableShape som en parameter og fører til at egenskapene til den overordnede formen på paraform. Vi trenger legge noe av funksjonaliteten til denne metoden. Vi skal overstyre denne metoden, men det betyr ikke at vi skal ha glemme alt som base klassen gjør med denne metoden. Vi vil bruke den super objekt å kalle metoden fra base klassen slik at den arver sin opprinnelige funksjonalitet samtidig legge ny funksjonalitet til den
    offentlige styringsfunksjon kopi (form: EditableShape):. Void {super.copy (form); if (formen er RectangleShape) {var rect: RectangleShape = form som RectangleShape; ellipseWidth = rect.ellipseWidth; ellipseHeight = rect.ellipseHeight; }}

    Kan du fortelle hva som skjedde? Hvis parameteren, form, er en RectangleShape vi også kopiere ellipseWidth og ellipseHeight egenskaper. Hvis du har en samling av RectangleShapes, som du bruker til å tegne en grafisk med, og du vil at de alle skal ha de samme ellipseWidth og ellipseHeight egenskaper, vil dette hindre deg fra å skrive for mange ekstra linjer med kode. Anmeldelser

    Den andre metoden vi trenger å overstyre er klonen metoden
    offentlige styringsfunksjon klone (): EditableShape {var formen. RectangleShape = super.clone () som RectangleShape; shape.ellipseWidth = _ellipseWidth; shape.ellipseHeight = _ellipseHeight; returnere form;}

    Klonen metoden arver også gjennomføringen av basisklassen. Men med denne implementeringen har vi lagt de ellipseWidth og ellipseHeight egenskaper

    Trinn 9:. Mer tilgang

    Skriv følgende getter og setter-metoder:
    offentlig funksjon satt ellipseWidth (verdi: Number) : void {if (verdi < 0) verdi = 0; _ellipseWidth = verdi; oppdatering ();} offentlig funksjon får ellipseWidth (): Antall {return _ellipseWidth;} offentlig funksjon satt ellipseHeight (verdi: Number): void {if (verdi < 0) verdi = 0; _ellipseHeight = verdi; oppdatering ();} offentlig funksjon får ellipseHeight (): Antall {return _ellipseHeight;}

    Vi har ikke bare gitt lese /skrive-tilgang som er nødvendig av utenfor kode, men vi har også sørget for at ellipseWidth og ellipseHeight er aldri under null. Det er også en umiddelbar reaksjon på disse eiendommene blir satt eller endres

    . Merk: Hvis du ikke ønsker å korrigere eventuelle verdier for de ellipseWidth eller ellispeHeight egenskaper, trenger du ikke må. Det kan være en tid når du ønsker det ellipseWidth eller ellipseHeight å være mindre enn null.

    Nå som vi har vår første form fullført. La oss ta en rask titt på hva vår form ser ut når vi først opprette den. Du må opprette et dokument klasse og opprette en ny forekomst av RectangleShape objekt i den. Legg den nye RectangleShape til scenen. Her er min kode.
    Stage.addChild (ny RectangleShape ());

    La oss se på resultatet

    Dette er hva våre formen ser ut som standard. Føl deg fri til å leke seg med det litt, slik at du får en god følelse for det. Prøv å endre farger eller endre størrelsen

    Trinn 9:. Tegning Circles

    Vi kommer til å lage en slags boblende effekt for de over tilstanden i vår knappen. Dette betyr at vi trenger bobler. Opprett EclipseShape klassen. Sørg for at det utvider EditableShape klassen
    pakken {public class EllipseShape strekker EditableShape {offentlig funksjon EllipseShape () {super ().; } Beskyttet Styringsfunksjonen draw (): void {getGraphics () drawEllipse (0, 0, bredde, høyde);. }}}

    Igjen kraften i arv har tillatt oss å resirkulere gamle koden i stedet for å skrive den samme koden igjen og igjen.