Tworzenie linii i wypełnień gradientowych

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Obiekt graphics umożliwia także rysowanie obrysów i wypełnień zawierających gradienty, a nie lite kolory. Do tworzenia obrysu gradientowego służy metoda lineGradientStyle() , a do tworzenia wypełnienia gradientowego służy metoda beginGradientFill() .

Obie metody mają te same parametry. Pierwsze cztery są parametrami wymaganymi. Są to typ, kolory, wartości alfa i współczynniki. Pozostałe cztery parametry są opcjonalne, ale pozwalają na zaawansowane dostosowanie gradientu.

  • Pierwszy parametr określa typ tworzonego gradientu. Dozwolone wartości to GradientType.LINEAR i GradientType.RADIAL .

  • Drugi parametr określa tablicę wartości kolorów, która ma być używana. W przypadku gradientu liniowego kolory będą rozmieszczone od lewej do prawej strony. W gradiencie promieniowym (RADIAL) będą rozmieszczone od wewnątrz w kierunku zewnętrznym. Kolejność kolorów w tablicy odzwierciedla kolejność rysowania kolorów w gradiencie.

  • Trzeci parametr określa przezroczystości alfa kolorów wyszczególnionych w poprzednim parametrze.

  • Czwarty parametr określa współczynniki, tj. wpływ poszczególnych kolorów na gradient. Dozwolone są wartości z przedziału 0–255. Wartości te nie oznaczają szerokości ani wysokości, lecz pozycję w gradiencie; 0 oznacza początek gradientu, a 255 oznacza koniec gradientu. Tablica współczynników musi zawierać wartości kolejno rosnące i mieć tyle samo elementów, co tablice kolorów i wartości alfa przekazane w drugim i trzecim parametrze.

Mimo że piąty parametr, macierz transformacji, jest opcjonalny, jest często stosowany, ponieważ udostępnia łatwą w użyciu i zaawansowaną metodę sterowania wyglądem gradientu. Jako ten parametr można przekazać instancję klasy Matrix. Najłatwiejszy sposób utworzenia obiektu Matrix dla gradientu polega na użyciu metody createGradientBox() klasy Matrix.

Definiowanie obiektu Matrix przeznaczonego do użycia z gradientem

Do definiowania gradientów używanych w kształtach służą metody beginGradientFill() i lineGradientStyle() klasy flash.display.Graphics. Definiując gradient, należy przekazać macierz jako jeden z parametrów tych metod.

Najprostszym sposobem zdefiniowania macierzy jest użycie metody createGradientBox() klasy Matrix. Metoda ta tworzy macierz służącą do definiowania gradientu. Skalę, obrót i położenie gradientu definiuje się za pomocą parametrów przekazywanych do metody createGradientBox() . Metoda createGradientBox() przyjmuje następujące parametry:

  • Szerokość pola gradientu: szerokość (w pikselach), na jakiej gradient zostanie rozpostarty.

  • Wysokość pola gradientu: wysokość (w pikselach), na jakiej gradient zostanie rozpostarty.

  • Obrót pola gradientu: obrót (w radianach), jakie zostanie zastosowany do gradientu.

  • Translacja pozioma: odległość (w pikselach), na jaką gradient zostanie przesunięty w poziomie.

  • Translacja pionowa: odległość (w pikselach), na jaką gradient zostanie przesunięty w pionie.

Na przykład weźmy pod uwagę gradient o następujących cechach:

  • GradientType.LINEAR

  • Dwa kolory, zielony i niebieski, ze tablicą ratios zawierającą wartości [0, 255]

  • SpreadMethod.PAD

  • InterpolationMethod.LINEAR_RGB

Poniższe przykłady przedstawiają gradienty, w których parametr rotation metody createGradientBox() ma różne wartości, ale wszystkie inne ustawienia są identyczne:

width = 100;

height = 100;

rotation = 0;

tx = 0;

ty = 0;

width = 100;

height = 100;

rotation = Math.PI/4; // 45°

tx = 0;

ty = 0;

width = 100;

height = 100;

rotation = Math.PI/2; // 90°

tx = 0;

ty = 0;

Poniższe przykłady ilustrują zmiany liniowego gradientu zielono-niebieskiego, w którym parametry rotation , tx i ty metody createGradientBox() mają różne wartości, ale wszystkie inne ustawienia są identyczne:

width = 50;

height = 100;

rotation = 0;

tx = 0;

ty = 0;

width = 50;

height = 100;

rotation = 0

tx = 50;

ty = 0;

width = 100;

height = 50;

rotation = Math.PI/2; // 90°

tx = 0;

ty = 0;

width = 100;

height = 50;

rotation = Math.PI/2; // 90°

tx = 0;

ty = 50;

Parametry width , height , tx i ty metody createGradientBox() mają wpływ na rozmiar i położenie promieniowego wypełnienia gradientowego, co ilustruje poniższy przykład:

width = 50;

height = 100;

rotation = 0;

tx = 25;

ty = 0;

Poniższy kod generuje ostatni przedstawiony gradient promieniowy:

import flash.display.Shape; 
import flash.display.GradientType; 
import flash.geom.Matrix; 
 
var type:String = GradientType.RADIAL; 
var colors:Array = [0x00FF00, 0x000088]; 
var alphas:Array = [1, 1]; 
var ratios:Array = [0, 255]; 
var spreadMethod:String = SpreadMethod.PAD; 
var interp:String = InterpolationMethod.LINEAR_RGB; 
var focalPtRatio:Number = 0; 
 
var matrix:Matrix = new Matrix(); 
var boxWidth:Number = 50; 
var boxHeight:Number = 100; 
var boxRotation:Number = Math.PI/2; // 90° 
var tx:Number = 25; 
var ty:Number = 0; 
matrix.createGradientBox(boxWidth, boxHeight, boxRotation, tx, ty); 
 
var square:Shape = new Shape; 
square.graphics.beginGradientFill(type,  
                            colors, 
                            alphas, 
                            ratios,  
                            matrix,  
                            spreadMethod,  
                            interp,  
                            focalPtRatio); 
square.graphics.drawRect(0, 0, 100, 100); 
addChild(square);

Należy zwrócić uwagę, że szerokość i wysokość wypełnienia gradientowego zależy od szerokości i wysokości macierzy gradientu, a nie od szerokości lub wysokości określonej przy rysowaniu za pomocą obiektu Graphics. Rysowanie w obiekcie Graphics sprowadza się do narysowania zawartości macierzy gradientu w danych współrzędnych. Nawet jeśli użyto jednej z metod do rysowania kształtów w obiekcie Graphics, takich jak drawRect() , gradient nie dopasowuje się do narysowanego kształtu — rozmiar gradientu należy określić w macierzy gradientu.

Poniżej zilustrowano widoczne różnice między wymiarami macierzy gradientu a wymiarami narysowanego kształtu:

var myShape:Shape = new Shape(); 
var gradientBoxMatrix:Matrix = new Matrix(); 
gradientBoxMatrix.createGradientBox(100, 40, 0, 0, 0); 
myShape.graphics.beginGradientFill(GradientType.LINEAR, [0xFF0000, 0x00FF00, 0x0000FF], [1, 1, 1], [0, 128, 255], gradientBoxMatrix); 
myShape.graphics.drawRect(0, 0, 50, 40); 
myShape.graphics.drawRect(0, 50, 100, 40); 
myShape.graphics.drawRect(0, 100, 150, 40); 
myShape.graphics.endFill(); 
this.addChild(myShape);

Ten kod rysuje trzy gradienty z tym samym stylem wypełnienia, w którym kolory czerwony, zielony i niebieski są równomiernie rozmieszczone. Gradienty rysowane są przy użyciu metody drawRect() z podaną szerokością odpowiednio 50, 100 i 150 pikseli. Macierz gradientu określona w metodzie beginGradientFill() ma szerokość 100 pikseli. Oznacza to, że pierwszy gradient obejmie tylko połowę całego „widma” trzech kolorów, drugi obejmie wszystkie kolory, a trzeci także obejmie wszystkie kolory i będzie zawierał dodatkowo 50 pikseli koloru niebieskiego po prawej stronie.

Metoda lineGradientStyle() działa podobnie jak metoda beginGradientFill() , z tym że przed rozpoczęciem rysowania oprócz zdefiniowania gradientu należy określić grubość obrysu, korzystając z metody lineStyle() . Poniższy kod rysuje prostokąty z obrysami w kolorze czerwonym, zielonym i niebieskim.

var myShape:Shape = new Shape(); 
var gradientBoxMatrix:Matrix = new Matrix(); 
gradientBoxMatrix.createGradientBox(200, 40, 0, 0, 0); 
myShape.graphics.lineStyle(5, 0); 
myShape.graphics.lineGradientStyle(GradientType.LINEAR, [0xFF0000, 0x00FF00, 0x0000FF], [1, 1, 1], [0, 128, 255], gradientBoxMatrix); 
myShape.graphics.drawRect(0, 0, 200, 40); 
this.addChild(myShape);

Więcej informacji na temat klasy Matrix zawiera sekcja Korzystanie z obiektów Matrix .