Filtrele vă permit să aplicați o serie de efecte obiectelor raster și obiectelor de afișare (de la umbre la teșitură și neclaritate). Fiecare filtru este definit ca o clasă. Prin urmare, utilizarea filtrelor implică crearea de instanțe de obiecte de filtrare, care nu pot fi diferențiate de crearea altor obiecte. După crearea unei instanțe a obiectului de filtrare, îl puteți aplica cu ușurință în obiectul afișat utilizând proprietatea filtrelor obiectului. În cazul unui obiect BitmapData, acest lucru se face folosind metoda applyFilter ().
Crearea unui filtru
Pentru a crea un obiect filtru, apelați pur și simplu metoda constructorului pentru clasa de filtrare selectată. De exemplu, pentru a crea un obiect DropShadowFilter, utilizați următorul cod:
Deși nu este prezentat aici, constructorul DropShadowFilter () (cum ar fi constructorii tuturor claselor de filtrare) ia un număr de parametri opționali pe care îi puteți folosi pentru a personaliza aspectul efectului de filtru.
Aplicarea filtrului
După ce creați un obiect filtru, îl puteți aplica unui obiect afișat sau unui obiect BitmapData. Metoda de aplicare a filtrului depinde de obiectul la care se aplică.
Aplicarea unui filtru pe un obiect afișat
Când se aplică efecte de filtrare unui obiect afișat, acest lucru se face utilizând proprietatea filtrelor. Proprietatea filtrelor obiectului de afișare este o instanță Array ale cărei elemente sunt obiecte de filtrare aplicate obiectului de afișare. Pentru a aplica un filtru unui obiect de afișare, creați o instanță a filtrului, adăugați-o în instanța Array și atribuiți acest obiect Array proprietăților filtrelor obiectului de afișare:
Dacă doriți să atribuiți mai multe filtre obiectului, pur și simplu adăugați toate filtrele instanței Array înainte de a le atribui proprietății filtrelor. Pentru obiectul Array, puteți adăuga mai multe obiecte, trecându-le la proiectant ca parametri. De exemplu, acest cod aplică un filtru de șanfren și un filtru de strălucire la un obiect de afișare creat anterior:
Pentru a crea o matrice care conține filtre, puteți utiliza noul constructor Array () (după cum se arată în exemplele anterioare) sau utilizați sintaxa literală Array plasând filtrele în paranteze pătrate ([]). De exemplu, următorul rând de cod:
efectuează aceeași acțiune ca și linia de cod
Dacă se aplică mai multe filtre pentru a afișa obiecte, acestea au efect secvențial și au un efect cumulativ. De exemplu, dacă o matrice de filtrare are două elemente (un filtru de șanf care este adăugat mai întâi și un filtru de umbră care este adăugat secund), filtrul de umbră este aplicat atât filtrului de șanfren, cât și obiectului de afișare. Acest lucru se datorează faptului că filtrul de umbră se află în matricea filtrului în a doua poziție. Dacă doriți să aplicați filtre fără efect cumulat, trebuie să aplicați fiecare filtru pe o nouă copie a obiectului de afișare.
Dacă unul sau mai multe filtre sunt atribuite doar unui obiect afișat, puteți crea o instanță a filtrului și îl puteți atribui obiectului într-o singură instrucțiune. De exemplu, următoarea linie de cod aplică un filtru de estompare la un obiect de afișare numit myDisplayObject:
Codul anterior creează o instanță Array folosind o matrice sintaxa literală (între paranteze), creează BlurFilter exemplu ca element obiect Array și atribuie acel Array la proprietatea filtrelor a obiectului de afișare cu numele myDisplayObject.
Ștergerea filtrelor de pe obiectul afișajului
Eliminarea tuturor filtrelor de la un obiect afișat este la fel de ușor ca atribuirea unei valori zero proprietăților filtrelor:
Dacă mai multe filtre sunt aplicate unui obiect și numai unul dintre filtre trebuie eliminat, trebuie să efectuați o serie de acțiuni pentru a modifica matricea proprietăților filtrelor. Pentru informații suplimentare, consultați problemele potențiale legate de utilizarea filtrelor.
Aplicarea unui filtru la un obiect BitmapData
Aplicarea unui filtru pe un obiect BitmapData necesită utilizarea aplicFilter () pe obiectul BitmapData:
Metoda applyFilter () aplică un filtru pentru obiectul original BitmapData, rezultând o nouă imagine filtrată. Această metodă nu modifică originalul; În schimb, rezultatul aplicării filtrului la imaginea originală este stocat în instanța BitmapData față de care se aplică metoda applyFilter ().
Cum funcționează filtrele
Filtrarea obiectelor afișate se face prin cachearea unei copii a obiectului sursă ca un bitmap transparent.
După aplicarea filtrului pe obiectul de afișare, timpul de executare cachează obiectul ca imagine bitmap, atâta timp cât obiectul are o listă validă de filtre. Pictura originală este apoi utilizată ca imagine sursă pentru toate efectele de filtrare ulterioare.
Fiecare obiect de afișare, de regulă, are două imagini raster: unul cu obiectul original nefiltrat și celălalt pentru imaginea finală obținută după filtrare. Imaginea finală este utilizată pentru vizualizare. Dacă obiectul afișajului nu se modifică, imaginea finală nu este actualizată.
Posibile probleme când lucrați cu filtre
Când lucrați cu filtre, trebuie să luați în considerare o serie de surse potențiale de confuzie sau probleme.
Cachearea filtrelor și a imaginilor raster
Pentru a aplica un filtru unui obiect de afișare, trebuie să activați cache-ul bitmap pentru acest obiect. Dacă aplicați un filtru pe un obiect afișat a cărui proprietate cacheAsBitmap este falsă. Proprietatea obiectului cacheAsBitmap este setată automat la adevărat. Dacă ștergeți ulterior toate filtrele de pe obiectul de afișare, proprietatea cacheAsBitmap va fi atribuită ultima valoare atribuită.
Schimbarea filtrelor în timpul rulării
Dacă ați aplicat deja unul sau mai multe filtre pe obiectul de afișare, nu puteți modifica setul de filtre adăugând filtre suplimentare sau ștergând filtre din matricea filtrelor. În schimb, pentru a adăuga sau modifica setul de filtre aplicat, trebuie să efectuați modificări într-o matrice separată și apoi să atribuiți acest matrice proprietăților obiectului filtrelor obiectului filtru pentru filtrele aplicate obiectului. Acest lucru este realizat cel mai ușor prin citirea matricei proprietăților filtrelor în variabila Array și efectuarea modificărilor la această matrice temporară. După aceea, matricea este realocată în proprietatea filtrelor obiectului de afișare. În cazuri mai complexe, poate fi necesar să se mențină o matrice principală separată de filtre. Se fac modificări și apoi matricea principală este realocată proprietăților filtrelor obiectului afișat după fiecare modificare.
Adăugarea unui filtru suplimentar
Procesul de adăugare a unui filtru suplimentar la un obiect afișat la care unul sau mai multe filtre sunt deja aplicate este afișat în codul următor. Mai întâi, se aplică un filtru de strălucire pe obiectul afișat numit myDisplayObject; atunci când se face clic pe obiectul de afișare, se apelează funcția addFilters (). În această funcție, două filtre suplimentare sunt aplicate la myDisplayObject:
Scoaterea unui filtru dintr-un set de filtre
Dacă este aplicată obiectului de afișare și mai multe filtre pentru a șterge unul dintre aceste filtre, continuând să folosească filtrele rămase la obiect, filtrele sunt copiate într-o matrice temporară, un filtru inutil este îndepărtat din matrice, și reafectarea apoi executați matrice temporară filtre de proprietate a obiectului de afișare. În secțiunea „Pregătirea valorilor și eliminarea elementelor de matrice“ set număr de moduri de a elimina una sau mai multe elemente din orice matrice.
Cea mai directă metodă este eliminarea filtrului cel mai de sus al obiectului (filtrul aplicat ultimului obiect). Metoda pop () a clasei Array este folosită pentru a elimina un filtru dintr-o matrice:
În mod similar, pentru a elimina cel mai mic filtru (primul filtru aplicat obiectului), se folosește același cod, înlocuind metoda shift () în locul metodei pop ().
Pentru a elimina un filtru din mijlocul matricei de filtre (presupunând că matricea are mai mult de două filtre), trebuie să utilizați metoda splice (). Trebuie să cunoașteți indicatorul (poziția din matrice) a filtrului pentru a fi eliminat. De exemplu, următorul cod elimină cel de-al doilea filtru (filtru cu indicatorul 1) din obiectul afișat:
Determinați indicatorul de filtru
Este necesar să știți care filtru trebuie eliminat din matrice pentru a găsi indicatorul de filtru. Este necesar fie să învățați (prin studierea modului în care se dezvoltă aplicația), fie să calculați indicatorul filtrului pentru a fi șters.
Abordarea cea mai optimă este de a dezvolta propria aplicație, astfel încât filtrul șters să fie întotdeauna în aceeași poziție în setul de filtre. De exemplu, dacă aveți un singur obiect afișat care are un filtru de convoluție și un filtru de umbră aplicat (în această ordine) și doriți să scoateți filtrul de umbră, menținând filtrul de convoluție, acest filtru se află în poziția cunoscută (filtrul cel mai de sus). Datorită acestui fapt, puteți ști întotdeauna în avans ce metodă Array să utilizați (în acest caz, Array.pop () pentru a elimina filtrul de umbră).
Dacă filtrul pe care doriți să îl eliminați întotdeauna aparține unui anumit tip, dar nu ocupă neapărat aceeași poziție în setul de filtre, puteți verifica tipul de date pentru fiecare filtru din matrice pentru a determina care să fie eliminat. De exemplu, următorul cod determină ce filtru din set este un filtru strălucitor și elimină acest filtru din set.
Într-un caz mai complex, de exemplu, atunci când filtrul șters este selectat la timpul de execuție, cea mai bună abordare este salvarea unei singure copii permanente a matricei de filtre care servește ca listă principală de filtre. De fiecare dată când efectuați modificări ale setului de filtre, schimbați lista de bază și apoi utilizați acest filtru ca proprietate de filtre a obiectului de afișare.
De exemplu, în următorul exemplu de cod, o serie de filtre de convoluție sunt aplicate obiectului de afișare pentru a crea diferite efecte vizuale. Mai târziu, în aplicație, unul dintre aceste filtre este șters, în timp ce ceilalți rămân. În acest caz, codul stochează copia principală a matricei de filtre, precum și un link către filtrul care urmează să fie șters. Căutarea și eliminarea unui filtru specific sunt similare cu abordarea anterioară, cu excepția faptului că, în loc să creeze o copie temporară a matricei de filtre, este procesată copia principală, care este apoi aplicată obiectului de afișare.
În această abordare (când comparați o referință de filtru salvată cu elemente dintr-o matrice de filtre pentru a determina filtrul care trebuie eliminat), trebuie să salvați o copie separată a matricei de filtre. Codul nu funcționează dacă comparați o referință de filtru salvată cu elemente dintr-o matrice temporară copiată din proprietatea filtrelor obiectului de afișare. Acest lucru se datorează faptului că atunci când atribuiți o matrice proprietăților filtrelor. Perioada de execuție creează o copie a fiecărui obiect filtru în matrice intern. Aceste copii (spre deosebire de obiectele sursă) sunt aplicate obiectului de afișare. Și când citiți proprietățile filtrelor într-o matrice temporară, matricea temporară conține referințe la obiectele filtrului copiat, mai degrabă decât referințele la obiectele filtrului original. Din acest motiv, dacă în exemplul anterior ați încercat să definiți indicatorul filterToRemove. comparând-o cu filtrele într-o serie temporară de filtre, nu s-au găsit rezultate.
Filtre și transformări de obiect
Niciuna dintre zonele filtrate (de exemplu, umbra) care se află în afara ferestrei dreptunghiulare a obiectului de afișare nu este considerată ca parte a suprafeței în scopul recunoașterii punctului care trebuie specificat (definirea unei suprapuneri sau traversarea unei instanțe cu o altă instanță). Deoarece metodele de recunoaștere a unui punct pentru clasa DisplayObject se bazează pe vectori, recunoașterea nu poate fi efectuată în raport cu rezultatul raster. De exemplu, dacă aplicați un filtru de șanfren la un exemplu de buton, recunoașterea nu va fi disponibilă pentru partea cotată a instanței.
Scalarea, rotirea și schimbarea nu sunt suportate de filtre; dacă obiectul filtrat în sine este scalat (dacă scaleX și scaleY nu sunt 100%), efectul filtrului nu este scalat cu instanța. Aceasta înseamnă că forma originală a instanței se rotește, se scaldă sau se mișcă, dar filtrul nu se rotește, nu scală și nu se mișcă cu instanța.
O instanță poate fi animată cu un filtru pentru a crea efecte realiste sau instanțe imbricate și folosiți clasa BitmapData pentru a anima filtrele pentru a obține acest efect.
Filtre și obiecte Bitmap
Dacă se aplică un filtru pentru obiectul BitmapData, proprietatea cacheAsBitmap este setată automat la true. Astfel, filtrul este aplicat efectiv unei copii a obiectului, și nu originalului.
Această copie este apoi plasată pe ecranul principal (deasupra obiectului sursă) cât mai aproape de cel mai apropiat pixel. Dacă se modifică limitele obiectului raster original, imaginea raster a copiei filtrată este recreată pe baza versiunii originale, mai degrabă decât întinsă și distorsionată.
Dacă ștergeți toate filtrele pentru obiectul afișat, proprietatea cacheAsBitmap va prelua valoarea atribuită acestuia înainte de a aplica filtrul.