使用图形数据类

Flash Player 10 和更高版本,Adobe AIR 1.5 和更高版本

增强的绘图 API 包括 flash.display 包中用于实现 IGraphicsData 接口的一组类。这些类用作表示绘图 API 的绘图方法的值对象(数据容器)。

通过这些类,可以将一个完整的绘图存储在一个 IGraphicsData 类型的 Vector 对象 (Vector.<IGraphicsData>) 中。之后您可以重新利用这些图形数据作为其他形状实例的数据源或存储绘图信息供以后使用。

请注意,每个填充样式有多个填充类,但只有一个笔触类。ActionScript 只有一个笔触类 IGraphicsData,因为该笔触类使用填充类来定义自己的样式。因此每个笔触实际上是由一个笔触类和一个填充类的组合定义的。否则,这些图形数据类的 API 会镜像它们在 flash.display.Graphics 类中表示的方法:

Graphics 方法

对应的类

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

此外,GraphicsPath 类拥有自己的 GraphicsPath.moveTo()GraphicsPath.lineTo()GraphicsPath.curveTo()GraphicsPath.wideLineTo()GraphicsPath.wideMoveTo() 实用程序方法,用于轻松为 GraphicsPath 实例定义这些命令。这些实用程序方法简化了直接定义或更新这些命令和数据值的过程。

使用矢量图形数据绘图

有了 IGraphicsData 实例集合之后,便可使用 Graphics 类的 drawGraphicsData() 方法来呈现图形了。drawGraphicsData() 方法将按顺序执行 IGraphicsData 实例矢量中的一组绘图指令:

// 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(GraphicsPathCommand.MOVE_TO, GraphicsPathCommand.LINE_TO, GraphicsPathCommand.LINE_TO); 
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);

通过修改示例中绘制所用路径的一个值,可以多次重绘形状,以生成更复杂的图像:

// 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 对象可以定义填充和笔触样式,但这两种样式并不是必需的。换句话说,可以在使用 IGraphicsData 对象绘制已保存路径集合的同时,使用 Graphics 类方法设置样式,反之亦然。

注: 开始新的绘制之前,请使用 Graphics.clear() 方法清除以前的绘制;除非如上例所示,要在原始绘制的基础上继续绘制。在更改路径或 IGraphicsData 对象集合的某个部分时,请重绘整个绘制来查看所做的更改。

使用图形数据类时,只要绘制了三点或更多点,就会呈示填充,这是因为形状实际上在该点闭合。即使填充闭合,笔触也不会闭合;这一行为与使用多个 Graphics.lineTo()Graphics.moveTo() 命令时不同。

读取矢量图形数据

除了将矢量内容绘制到显示对象之外,在 Flash Player 11.6 和 Adobe AIR 3.6 及更高版本中,您还可以使用 Graphics 类的 readGraphicsData() 方法来获取显示对象的矢量图形内容的数据表示。这可以用于创建一个图形快照以便在运行时保存、复制、创建 Sprite 表等等。

调用 readGraphicsData() 方法将返回一个包含 IGraphicsData 对象的 Vector 实例。这些对象就是使用 drawGraphicsData() 方法绘制矢量图形所用的对象。

使用 readGraphicsData() 方法读取矢量图形存在一些限制。有关详细信息,请参阅《ActionScript 语言参考》中的 readGraphicsData() 条目