În acest sfat rapid, vă vom arăta cum să creați un instrument Shapshot care copiază o parte a scenei și salvează rezultatul ca imagine PNG.
Acesta este rezultatul final. Doar faceți clic pe scenă și trageți mouse-ul pentru a face o fotografie.
Creați un folder nou pentru acest proiect și dați-i numele dorit. Mergeți la Github și descărcați cea mai recentă versiune a as3corelib Clasă. Pentru acest sfat rapid am folosit versiunea .93. Extrageți fișierul ZIP și mergeți la as3corelib-.93> src.
Copiați com director în dosarul nou creat. Acest pachet este foarte util PNGEncoder
Clasa pe care o vom folosi pentru codarea
instantaneu într-o imagine PNG.
Lansați Flash și creați un nou document Flash. Asigurați-vă că este setat să se publice la Actionscript 3.0 și Flash Player 10. Puteți verifica acest lucru în Properties
panou sau prin selectarea Publicați setările ... și apoi faceți clic pe bliț fila.
Avem nevoie de conținut în fișierul Flash pentru a verifica dacă instrumentul instantaneu funcționează corect. Vom crea câteva cercuri și le vom pune în mod aleatoriu în jurul scenei. Creați o nouă clasă de documente numită Circles.as și adăugați următorul cod. Nu uitați să conectați clasa la fișierul Flash scriind cerc în Clasă domeniu în Proprietăți Panou.
pachet import flash.display.Shape; import flash.display.Sprite; clasele publice de clasă extind Sprite private var _circleCount: int = 20; funcția publică funcțională Cercuri () makeCircles (); funcția privată makeCircles (): void pentru (var i: int = 0; i < _circleCount; i++) var circle:Shape = new Shape(); circle.graphics.lineStyle(1, 0xCCCCCC, 1); circle.graphics.beginFill(0x333333, 0.5); circle.graphics.drawCircle(Math.random() * stage.stageWidth, Math.random() * stage.stageHeight, (Math.random() * 40) + 20); circle.graphics.endFill(); addChild(circle);
Funcția noastră instantanee va funcționa cu orice conținut al scenei, deși nu vă simțiți că trebuie să vă limitați la forme simple!
Creați un nou fișier de clasă și dați-i numele SnapShot.as. Aceasta este clasa care va păstra toate metodele folosite pentru a face o fotografie instantanee. Adăugați în clasă următorul cod.
pachet import flash.display.Stage; clasa publică SnapShot private var _stage: Stage; funcția publică Snapshot () funcția publică activă (etapă: Etapa): void _stage = stage;
Adăugați următoarele linii de cod la cerc Clasă. Noi folosim Activati()
metoda de a transmite o trimitere la Etapa de-a lungul Instantaneu
Clasă. Facem acest lucru pentru a putea accesa conținutul din Etapă.
pachet import flash.display.Shape; import flash.display.Sprite; clasele publice de clasă extind Sprite private var _circleCount: int = 20; privat var _snapshot: SnapShot; funcția publică funcțională Cercuri () makeCircles (); _snapshot = SnapShot nou (); _snapshot.activate (etapa); funcția privată makeCircles (): void pentru (var i: int = 0; i < _circleCount; i++) var circle:Shape = new Shape(); circle.graphics.lineStyle(1, 0xCCCCCC, 1); circle.graphics.beginFill(0x333333, 0.5); circle.graphics.drawCircle(Math.random() * stage.stageWidth, Math.random() * stage.stageHeight, (Math.random() * 40) + 20); circle.graphics.endFill(); addChild(circle);
Extindeți Instantaneu
Clasa pentru a include următoarele metode. Aceste metode sunt folosite pentru a desena cadrul de granițe, care permite utilizatorilor să selecteze care parte a scenei va fi copiată în instantaneu.
pachet import flash.display.Shape; import flash.display.Stage; importul flash.events.Event; importul flash.events.MouseEvent; clasa publică SnapShot private var _stage: Stage; private var _boundary: Formă; privat var _originX: int; privat var _originY: int; privat var _mouseX: int; privat var _mouseY: int; funcția publică SnapShot () funcția publică activă (etapă: etapă): void _stage = stage; addMouseListeners (); funcția privată addMouseListeners (): void _stage.addEventListener (MouseEvent.MOUSE_DOWN, onMouseDown); _stage.addEventListener (MouseEvent.MOUSE_UP, onMouseUp); funcția privată onMouseDown (e: MouseEvent): void _stage.addEventListener (MouseEvent.MOUSE_MOVE, drawBoundaries); // Aceste valori sunt folosite mai târziu ca punct de plecare pentru limită. _originX = _stage.mouseX; _originY = _stage.mouseY; funcția privată drawBoundaries (e: MouseEvent): void if (_boundary == null) _boundary = new Formă (); clearBoundaries () // Aceasta este de a face valoarea mouseY stay în limitele Stage. _mouseY = Math.max (Math.min (_stage.mouseY, _stage.stageHeight), 0); // Aceasta va face ca valoarea mouseX să rămână în limitele Stadiului. _mouseX = Math.max (Math.min (_stage.mouseX, _stage.stageWidth), 0); _boundary.graphics.lineStyle (2, 0x0, 0,5); _boundary.graphics.drawRect (_originX, _originY, _mouseX - _originX, _mouseY - _originY); _boundary.graphics.lineStyle (4, 0x0, 0,2); // Acest cod ne asigură că întotdeauna tragem din punctul din stânga sus în dreapta jos. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ; _stage.addChild (_boundary); funcția privată clearBoundaries (): void _boundary.graphics.clear (); funcția privată onMouseUp (e: Event): void _stage.removeEventListener (MouseEvent.MOUSE_MOVE, drawBoundaries); clearBoundaries ();
Începem verificând dacă utilizatorul a făcut clic pe Etapă
. Când face clic pe scenă, începem să rulam drawBoundaries ()
atunci când mouse-ul este mutat. Această metodă atrage limitele; indiferent ce se încadrează în linia neagră subțire va face parte din instantaneu. Când utilizatorul eliberează mouse-ul, stopăm verificarea mișcărilor mouse-ului.
Importați BitmapData
și Matrice
Clase și adăugați _conţinut
proprietate la lista de proprietăți private.
pachet import flash.display.BitmapData; import flash.display.Shape; import flash.display.Stage; importul flash.events.Event; importul flash.events.MouseEvent; import flash.geom.Matrix; import flash.geom.Rectangle; clasa publică SnapShot private var _stage: Stage; private var _boundary: Formă; privat var _content: BitmapData; privat var _originX: int; privat var _originY: int; privat var _mouseX: int; privat var _mouseY: int;
Adăugați următorul cod în partea de jos a clasei:
funcția privată onMouseUp (e: Event): void _stage.removeEventListener (MouseEvent.MOUSE_MOVE, drawBoundaries); clearBoundaries (); createBitmap (); funcția privată createBitmap (): void // Adăugăm -2 pentru a compensa linia de graniță. _content = BitmapData nou (Math.abs (_mouseX - _originX) - 2, Math.abs (_mouseY - _originY) - 2); // Se adaugă -1 din același motiv, pentru a nu apărea linia în imaginea finală. var bitmapMatrix: matrice = matrice nouă (1, 0, 0, 1, -Math.min (_originX, _mouseX) - 1, -Math.min (_originY, _mouseY) - 1); _content.draw (_stage, bitmapMatrix);
createBitmap ()
metoda creează un nou BitmapData
obiect cu lățimea și înălțimea zonei de conținut din interiorul graniței. matrice tranziții variabile (mută) imaginea astfel încât atunci când a desena()
metoda se numește începe copierea din colțul din stânga sus al zonei de frontieră.
Pentru a salva bitmapul trebuie să importăm mai multe clase.
ByteArray
Clasa este folosită pentru a codifica BitmapData
obiect.PNGEncoder
Clasa este utilizată pentru a converti datele codificate într-o imagine PNG.Fișier de referință
Clasa este utilizată pentru a salva imaginea pe hard diskul utilizatorilor.Am adăugat și o _imageCount
proprietate pe care o folosim pentru a incrementa numele de imagine.
pachet import com.adobe.images.PNGEncoder; import flash.display.BitmapData; import flash.display.Shape; import flash.display.Stage; importul flash.events.Event; importul flash.events.MouseEvent; import flash.geom.Matrix; import flash.geom.Rectangle; import flash.net.FileReference; import flash.utils.ByteArray; clasa publică Snapshot private var _stage: Stage; private var _boundary: Formă; privat var _content: BitmapData; privat var _originX: int; privat var _originY: int; privat var _mouseX: int; privat var _mouseY: int; privat var _imageCount: int = 1;
Adăugați următorul cod în partea de jos a clasei SnapShot:
funcția privată createBitmap (): void _content = nou BitmapData (Math.abs (_mouseX - _originX) - 2, Math.abs (_mouseY - _originY) - 2); var bitmapMatrix: matrice = matrice nouă (1, 0, 0, 1, -Math.min (_originX, _mouseX) - 1, -Math.min (_originY, _mouseY) - 1); _content.draw (_stage, bitmapMatrix); saveBitmap (); funcția privată saveBitmap (): void var encodedContent: ByteArray = PNGEncoder.encode (_content); var fișierWindow: FileReference = Fișier nou (); fileWindow.save (codedContent, "Image_" + _imageCount + ".png"); _imageCount ++;
saveBitmap
metoda este destul de ușor de înțeles. Codificăm codul BitmapData
obiect și salvați-l pe unitatea hard disk a utilizatorului.
Noi folosim _imageCount
proprietăți pentru a ușura salvarea mai multor imagini la rând.
Instrumentul Snapshot este acum complet și cu doar trei linii de cod poate fi implementat în orice proiect.
Asigurați-vă că executați Flash Player 10 și că aveți pachetul as3corelib în directorul corect.
Sper că v-ați bucurat de acest sfat rapid, vă mulțumesc pentru lectură!