Använda grafiska dataklasser

Flash Player 10 och senare, Adobe AIR 1.5 och senare

I de förbättrade funktionerna för Drawing API ingår en ny samling klasser i flash.display-paketet av typen IGraphicsData (ett gränssnitt för varje implementerad klass). Klasserna som implementerar IGraphicsData-gränssnittet fungerar som databehållare för metoderna i Drawing API.

Med dessa klasser kan du lagra kompletta teckningar i en vektorobjektarray av typen IGraphicsData (Vector.<IGraphicsData>) som kan återanvändas som datakälla för andra forminstanser eller för att lagra ritinformation för senare bruk.

Observera att det finns flera fyllningsklasser för varje fyllningsformat, men bara en linjeklass. ActionScript innehåller bara en IGraphicsData-linjeklass eftersom linjeklasser använder fyllningsklasserna när formatet definieras. Varje linje består i själva verket av linjeklassen och en fyllningsklass. API:et för dessa grafiska dataklasser avspeglar annars metoderna som de representerar i klassen flash.display.Graphics:

Graphics-metod

Dataklass

beginBitmapFill()

GraphicsBitmapFill

beginFill()

GraphicsSolidFill

beginGradientFill()

GraphicsGradientFill

beginShaderFill()

GraphicsShaderFill

lineBitmapStyle()

GraphicsStroke + GraphicsBitmapFill

lineGradientStyle()

GraphicsStroke + GraphicsGradientFill

lineShaderStyle()

GraphicsStroke + GraphicsShaderFill

lineStyle()

GraphicsStroke + GraphicsSolidFill

moveTo()

lineTo()

curveTo()

drawPath()

GraphicsPath

drawTriangles()

GraphicsTrianglePath

Dessutom har klassen GraphicsPath egna GraphicsPath.moveTo()-, GraphicsPath.lineTo()-, GraphicsPath.curveTo()-, GraphicsPath.wideLineTo()- och GraphicsPath.wideMoveTo()-verktygsmetoder så att dessa kommandon enkelt kan definieras för en GraphicsPath-instans. Dessa verktygsmetoder gör det enkelt att definiera och uppdatera kommandona och datavärdena direkt.

När du har en mängd med IGraphicsData-instanser använder du metoden Graphics.drawGraphicsData() när du vill återge grafiken. Metoden Graphics.drawGraphicsData() kör en vektor med IGraphicsData-instanser via Drawing API i tur och ordning:

// stroke object 
var stroke:GraphicsStroke = new GraphicsStroke(3); 
stroke.joints = JointStyle.MITER; 
stroke.fill = new GraphicsSolidFill(0x102020);// solid stroke 
 
// fill object 
var fill:GraphicsGradientFill = new GraphicsGradientFill(); 
fill.colors = [0x0000FF, 0xEEFFEE]; 
fill.matrix = new Matrix(); 
fill.matrix.createGradientBox(70,70, Math.PI/2); 
// path object 
var path:GraphicsPath = new GraphicsPath(new Vector.<int>(), new Vector.<Number>()); 
path.commands.push(1,2,2); 
path.data.push(125,0, 50,100, 175,0); 
 
// combine objects for complete drawing 
var drawing:Vector.<IGraphicsData> = new Vector.<IGraphicsData>(); 
drawing.push(stroke, fill, path); 
 
// draw the drawing 
graphics.drawGraphicsData(drawing);

Genom att ändra ett värde i banan som används av teckningen i exemplet, kan du rita om formen flera gånger och få en mer komplex bild:

// draw the drawing multiple times 
// change one value to modify each variation 
graphics.drawGraphicsData(drawing); 
path.data[2] += 200; 
graphics.drawGraphicsData(drawing); 
path.data[2] -= 150; 
graphics.drawGraphicsData(drawing); 
path.data[2] += 100; 
graphics.drawGraphicsData(drawing); 
path.data[2] -= 50;graphicsS.drawGraphicsData(drawing);

IGraphicsData-objekt kan definiera fyllnings- och linjeformat, men fyllnings- och linjeformat är inget krav. Graphics-klassmetoder kan med andra ord användas för att ställa in format medan IGraphicsData-objekt kan användas för att rita en sparad mängd med banor, och tvärtom.

Obs! Använd metoden Graphics.clear() om du vill ta bort en tidigare teckning innan du påbörjar en ny, såvida du inte lägger till något i den ursprungliga teckningen som i exemplet ovan. När du ändrar en enskild del av en bana eller mängd med IGraphicsData-objekt, måste du rita om hela teckningen för att kunna se ändringarna.

När du använder grafikdataklasser återges fyllningen när tre eller fler punkter ritas, eftersom formen är stängd vid den punkten. Även om fyllningen stängs gör inte linjen det, och dess beteende är ett annat än när du använder flera Graphics.lineTo()- eller Graphics.moveTo()-kommandon.