包 | flash.geom |
类 | public class Matrix |
继承 | Matrix Object |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
matrix
属性,然后应用该 Transform 对象作为显示对象的 transform
属性。这些转换函数包括平移(x 和 y 重新定位)、旋转、缩放和倾斜。
这些转换类型统称为仿射转换。仿射转换在转换时保持线条笔直,因此平行线保持平行。
要对显示对象应用转换矩阵,请创建一个 Transform 对象,将其 matrix
属性设置为转换矩阵,然后将显示对象的 transform
属性设置为 Transform 对象。Matrix 对象也被用作某些方法的参数,例如以下方法:
- BitmapData 对象的
draw()
方法 - Graphics 对象的
beginBitmapFill()
方法、beginGradientFill()
方法或lineGradientStyle()
方法
转换矩阵对象为具有如下内容的 3 x 3 的矩阵:
在传统的转换矩阵中,u
、v
和 w
属性具有其他功能。Matrix 类只能在二维空间中操作,因此始终假定属性值 u
和 v
为 0.0,属性值 w
为 1.0。矩阵的有效值如下:
您可以获取和设置 Matrix 对象的全部六个其他属性的值:a
、b
、c
、d
、tx
和 ty
。
Matrix 类支持四种主要类型的转换:平移、缩放、旋转和倾斜。您可以使用特定的方法来设置这些转换的其中三个,如下表中所述:
转换 | 方法 | 矩阵值 | 显示结果 | 说明 |
---|---|---|---|---|
平移(置换) |
translate(tx, ty)
| 将图像 tx 像素向右移动,将 ty 像素向下移动。 | ||
缩放 |
scale(sx, sy)
| 将每个像素的位置乘以 x 轴的 sx 和 y 轴的 sy ,从而调整图像的大小。 | ||
旋转 |
rotate(q)
| 将图像旋转一个以弧度为单位的角度 q 。 | ||
倾斜或剪切 | 无;必须设置属性 b 和 c
| 以平行于 x 轴或 y 轴的方向逐渐滑动图像。Matrix 对象的 b 属性表示斜角沿 y 轴的正切;Matrix 对象的 c 属性表示斜角沿 x 轴的正切。 |
每个转换函数都将更改当前矩阵的属性,所以您可以有效地合并多个转换。为此,请先调用多个转换函数,再将矩阵应用于其显示对象目标(通过使用该显示对象的 transform
属性)。
使用 new Matrix()
构造函数创建 Matrix 对象后,才能调用 Matrix 对象的方法。
相关 API 元素
flash.geom.Transform
flash.display.BitmapData.draw()
flash.display.Graphics.beginBitmapFill()
flash.display.Graphics.beginGradientFill()
flash.display.Graphics.lineGradientStyle()
属性 | 由以下参数定义 | ||
---|---|---|---|
a : Number
缩放或旋转图像时影响像素沿 x 轴定位的值。 | Matrix | ||
b : Number
旋转或倾斜图像时影响像素沿 y 轴定位的值。 | Matrix | ||
c : Number
旋转或倾斜图像时影响像素沿 x 轴定位的值。 | Matrix | ||
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
d : Number
缩放或旋转图像时影响像素沿 y 轴定位的值。 | Matrix | ||
tx : Number
沿 x 轴平移每个点的距离。 | Matrix | ||
ty : Number
沿 y 轴平移每个点的距离。 | Matrix |
方法 | 由以下参数定义 | ||
---|---|---|---|
使用指定参数创建新的 Matrix 对象。 | Matrix | ||
返回一个新的 Matrix 对象,它是此矩阵的克隆,带有与所含对象完全相同的副本。 | Matrix | ||
将某个矩阵与当前矩阵连接,从而将这两个矩阵的几何效果有效地结合在一起。 | Matrix | ||
将 Vector3D 对象复制到调用方 Matrix3D 对象的特定列中。 | Matrix | ||
将调用方 Matrix 对象的特定列复制到 Vector3D 对象中。 | Matrix | ||
将源 Point 对象中的所有矩阵数据复制到调用方 Matrix 对象中。 | Matrix | ||
将 Vector3D 对象复制到调用方 Matrix 对象的特定行中。 | Matrix | ||
将调用方 Matrix 对象的特定行复制到 Vector3D 对象中。 | Matrix | ||
包括用于缩放、旋转和转换的参数。 | Matrix | ||
createGradientBox(width:Number, height:Number, rotation:Number = 0, tx:Number = 0, ty:Number = 0):void
创建 Graphics 类的 beginGradientFill() 和 lineGradientStyle() 方法所需的矩阵的特定样式。 | Matrix | ||
如果给定预转换坐标空间中的点,则此方法返回发生转换后该点的坐标。 | Matrix | ||
表示对象是否已经定义了指定的属性。 | Object | ||
为每个矩阵属性设置一个值,该值将导致 null 转换。 | Matrix | ||
执行原始矩阵的逆转换。 | Matrix | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
对 Matrix 对象应用旋转转换。 | Matrix | ||
对矩阵应用缩放转换。 | Matrix | ||
设置循环操作动态属性的可用性。 | Object | ||
将 Matrix 的成员设置为指定值
| Matrix | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回列出该 Matrix 对象属性的文本值。 | Matrix | ||
返回将 Matrix 对象表示的几何转换应用于指定点所产生的结果。 | Matrix | ||
沿 x 和 y 轴平移矩阵,由 dx 和 dy 参数指定。 | Matrix | ||
返回指定对象的原始值。 | Object |
a | 属性 |
b | 属性 |
public var b:Number
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
旋转或倾斜图像时影响像素沿 y 轴定位的值。
示例 ( 如何使用本示例 )
myMatrix
并设置它的 b
值。
import flash.geom.Matrix; var myMatrix:Matrix = new Matrix(); trace(myMatrix.b); // 0 var degrees:Number = 30; var radians:Number = (degrees/180) * Math.PI; myMatrix.b = Math.tan(radians); trace(myMatrix.b); // 0.5773502691896257
c | 属性 |
public var c:Number
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
旋转或倾斜图像时影响像素沿 x 轴定位的值。
示例 ( 如何使用本示例 )
myMatrix
并设置它的 c
值。
import flash.geom.Matrix; var myMatrix:Matrix = new Matrix(); trace(myMatrix.c); // 0 var degrees:Number = 30; var radians:Number = (degrees/180) * Math.PI; myMatrix.c = Math.tan(radians); trace(myMatrix.c); // 0.5773502691896257
d | 属性 |
tx | 属性 |
ty | 属性 |
Matrix | () | 构造函数 |
public function Matrix(a:Number = 1, b:Number = 0, c:Number = 0, d:Number = 1, tx:Number = 0, ty:Number = 0)
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
使用指定参数创建新的 Matrix 对象。在矩阵表示法中,按如下方式组织属性:
如果不向 new Matrix()
构造函数提供任何参数,它将创建一个具有以下值的恒等矩阵:
在矩阵表示法中,恒等矩阵如下所示:
参数a:Number (default = 1 ) — 缩放或旋转图像时影响像素沿 x 轴定位的值。
| |
b:Number (default = 0 ) — 旋转或倾斜图像时影响像素沿 y 轴定位的值。
| |
c:Number (default = 0 ) — 旋转或倾斜图像时影响像素沿 x 轴定位的值。
| |
d:Number (default = 1 ) — 缩放或旋转图像时影响像素沿 y 轴定位的值。
| |
tx:Number (default = 0 ) — 沿 x 轴平移每个点的距离。
| |
ty:Number (default = 0 ) — 沿 y 轴平移每个点的距离。
|
示例 ( 如何使用本示例 )
Matrix()
构造函数发送参数创建 matrix_1
,而通过向该构造函数发送参数创建 matrix_2
。请注意,未使用参数创建的 matrix_1
将生成一个具有值 a
=1、b
=0、c
=0、d
=1、tx
=0、ty
=0 的恒等矩阵。
import flash.geom.Matrix; var matrix_1:Matrix = new Matrix(); trace(matrix_1); // (a=1, b=0, c=0, d=1, tx=0, ty=0) var matrix_2:Matrix = new Matrix(1, 2, 3, 4, 5, 6); trace(matrix_2); // (a=1, b=2, c=3, d=4, tx=5, ty=6)
clone | () | 方法 |
concat | () | 方法 |
public function concat(m:Matrix):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
将某个矩阵与当前矩阵连接,从而将这两个矩阵的几何效果有效地结合在一起。在数学术语中,将两个矩阵连接起来与使用矩阵乘法将它们结合起来是相同的。
例如,如果矩阵 m1
使用系数 4 缩放某个对象,而矩阵 m2
使用 1.5707963267949 弧度 (Math.PI/2
) 旋转该对象,则 m1.concat(m2)
会将 m1
转换为一个使用系数 4 缩放对象并使用 Math.PI/2
弧度旋转该对象的矩阵。
此方法将源矩阵替换为连接矩阵。如果要在不更改两个源矩阵中的任何一个的情况下连接这两个矩阵,则可以通过使用 clone()
方法首先复制源矩阵,如“类示例”部分中所示。
参数
m:Matrix — 要连接到源矩阵的矩阵。
|
copyColumnFrom | () | 方法 |
copyColumnTo | () | 方法 |
copyFrom | () | 方法 |
copyRowFrom | () | 方法 |
copyRowTo | () | 方法 |
createBox | () | 方法 |
public function createBox(scaleX:Number, scaleY:Number, rotation:Number = 0, tx:Number = 0, ty:Number = 0):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
包括用于缩放、旋转和转换的参数。当应用于矩阵时,该方法会基于这些参数设置矩阵的值。
通过使用 createBox()
方法,您可以获得与依次应用 identity()
、rotate()
、scale()
和 translate()
方法时得到的矩阵相同的矩阵。例如,mat1.createBox(2,2, ,Math.PI/4, 100, 100)
具有与如下所示代码相同的效果:
import flash.geom.Matrix; var mat1:Matrix = new Matrix(); mat1.identity(); mat1.rotate(Math.PI/4); mat1.scale(2,2); mat1.translate(10,20);
参数
scaleX:Number — 水平缩放所用的系数。
| |
scaleY:Number — 垂直缩放所用的系数。
| |
rotation:Number (default = 0 ) — 旋转量(以弧度为单位)。
| |
tx:Number (default = 0 ) — 沿 x 轴向右平移(移动)的像素数。
| |
ty:Number (default = 0 ) — 沿 y 轴向下平移(移动)的像素数。
|
相关 API 元素
示例 ( 如何使用本示例 )
myMatrix
的 createBox()
方法来设置它的 x 缩放比例、y 缩放比例、旋转、x 位置和 y 位置。
package { import flash.display.Shape; import flash.display.Sprite; import flash.geom.Matrix; import flash.geom.Transform; public class Matrix_createBox extends Sprite { public function Matrix_createBox() { var myMatrix:Matrix = new Matrix(); trace(myMatrix.toString()); // (a=1, b=0, c=0, d=1, tx=0, ty=0) myMatrix.createBox(1, 2, Math.PI/4, 50, 100); trace(myMatrix.toString()); // (a=0.7071067811865476, b=1.414213562373095, c=-0.7071067811865475, // d=1.4142135623730951, tx=50, ty=100) var rectangleShape:Shape = createRectangle(20, 80, 0xFF0000); addChild(rectangleShape); var rectangleTrans:Transform = new Transform(rectangleShape); rectangleTrans.matrix = myMatrix; } public function createRectangle(w:Number, h:Number, color:Number):Shape { var rect:Shape = new Shape(); rect.graphics.beginFill(color); rect.graphics.drawRect(0, 0, w, h); addChild(rect); return rect; } } }
createGradientBox | () | 方法 |
public function createGradientBox(width:Number, height:Number, rotation:Number = 0, tx:Number = 0, ty:Number = 0):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
创建 Graphics 类的 beginGradientFill()
和 lineGradientStyle()
方法所需的矩阵的特定样式。宽度和高度被缩放为 scaleX
/scaleY
对,而 tx
/ty
值偏移了宽度和高度的一半。
例如,假设渐变具有以下特性:
GradientType.LINEAR
- 绿色和蓝色这两种颜色(比例数组设置为
[0, 255]
) SpreadMethod.PAD
InterpolationMethod.LINEAR_RGB
下图显示了使用 createGradientBox()
方法以不同参数设置在其中定义矩阵的渐变:
createGradientBox() 设置 | 生成的渐变 |
---|---|
width = 25; height = 25; rotation = 0; tx = 0; ty = 0; | |
width = 25; height = 25; rotation = 0; tx = 25; ty = 0; | |
width = 50; height = 50; rotation = 0; tx = 0; ty = 0; | |
width = 50; height = 50; rotation = Math.PI / 4; // 45 degrees tx = 0; ty = 0; |
参数
width:Number — 渐变框的宽度。
| |
height:Number — 渐变框的高度。
| |
rotation:Number (default = 0 ) — 旋转量(以弧度为单位)。
| |
tx:Number (default = 0 ) — 沿 x 轴向右平移的距离(以像素为单位)。此值将偏移 width 参数的一半。
| |
ty:Number (default = 0 ) — 沿 y 轴向下平移的距离(以像素为单位)。此值将偏移 height 参数的一半。
|
相关 API 元素
示例 ( 如何使用本示例 )
myMatrix
的 createBox()
方法来设置它的 x 缩放比例、y 缩放比例、旋转、x 位置和 y 位置。
package { import flash.display.GradientType; import flash.display.Sprite; import flash.geom.Matrix; public class Matrix_createGradientBox extends Sprite { public function Matrix_createGradientBox() { var myMatrix:Matrix = new Matrix(); trace(myMatrix.toString()); // (a=1, b=0, c=0, d=1, tx=0, ty=0) myMatrix.createGradientBox(200, 200, 0, 50, 50); trace(myMatrix.toString()); // (a=0.1220703125, b=0, c=0, d=0.1220703125, tx=150, ty=150) var colors:Array = [0xFF0000, 0x0000FF]; var alphas:Array = [100, 100]; var ratios:Array = [0, 0xFF]; this.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, myMatrix); this.graphics.drawRect(0, 0, 300, 200); } } }
deltaTransformPoint | () | 方法 |
identity | () | 方法 |
public function identity():void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
为每个矩阵属性设置一个值,该值将导致 null 转换。通过应用恒等矩阵转换的对象将与原始对象完全相同。
调用 identity()
方法后,生成的矩阵具有以下属性:a
=1、b
=0、c
=0、d
=1、tx
=0 和 ty
=0。
在矩阵表示法中,恒等矩阵如下所示:
invert | () | 方法 |
public function invert():void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
执行原始矩阵的逆转换。您可以将一个逆矩阵应用于对象来撤消在应用原始矩阵时执行的转换。
示例 ( 如何使用本示例 )
halfScaleMatrix
,方法是调用 doubleScaleMatrix
的 invert()
方法。然后它将显示这两个矩阵互为逆矩阵(即两个矩阵互相撤消由另一个矩阵执行的所有转换操作),方法是通过创建 originalAndInverseMatrix
,它等同于 noScaleMatrix
。
package { import flash.display.Shape; import flash.display.Sprite; import flash.geom.Matrix; import flash.geom.Transform; public class Matrix_invert extends Sprite { public function Matrix_invert() { var rect0:Shape = createRectangle(20, 80, 0xFF0000); var rect1:Shape = createRectangle(20, 80, 0x00FF00); var rect2:Shape = createRectangle(20, 80, 0x0000FF); var rect3:Shape = createRectangle(20, 80, 0x000000); var trans0:Transform = new Transform(rect0); var trans1:Transform = new Transform(rect1); var trans2:Transform = new Transform(rect2); var trans3:Transform = new Transform(rect3); var doubleScaleMatrix:Matrix = new Matrix(2, 0, 0, 2, 0, 0); trans0.matrix = doubleScaleMatrix; trace(doubleScaleMatrix.toString()); // (a=2, b=0, c=0, d=2, tx=0, ty=0) var noScaleMatrix:Matrix = new Matrix(1, 0, 0, 1, 0, 0); trans1.matrix = noScaleMatrix; rect1.x = 50; trace(noScaleMatrix.toString()); // (a=1, b=0, c=0, d=1, tx=0, ty=0) var halfScaleMatrix:Matrix = doubleScaleMatrix.clone(); halfScaleMatrix.invert(); trans2.matrix = halfScaleMatrix; rect2.x = 100; trace(halfScaleMatrix.toString()); // (a=0.5, b=0, c=0, d=0.5, tx=0, ty=0) var originalAndInverseMatrix:Matrix = doubleScaleMatrix.clone(); originalAndInverseMatrix.concat(halfScaleMatrix); trans3.matrix = originalAndInverseMatrix; rect3.x = 150; trace(originalAndInverseMatrix.toString()); // (a=1, b=0, c=0, d=1, tx=0, ty=0) } public function createRectangle(w:Number, h:Number, color:Number):Shape { var rect:Shape = new Shape(); rect.graphics.beginFill(color); rect.graphics.drawRect(0, 0, w, h); addChild(rect); return rect; } } }
rotate | () | 方法 |
scale | () | 方法 |
setTo | () | 方法 |
toString | () | 方法 |
transformPoint | () | 方法 |
translate | () | 方法 |
MatrixExample
类来说明如何创建大的渐变填充正方形。这是由以下步骤完成的:
- 应用程序创建新的 Matrix 对象
myMatrix
,该对象使用trace()
方法输出myMatrix
对象的默认属性值。 - 应用程序调用
createGradientBox()
,其width
和height
参数设置为 200 像素,无旋转,且沿 x 轴和 y 轴平移的距离设置为 50 像素。 - 应用程序将再次打印
myMatrix
对象以显示调用createGradientBox()
方法后的更改。 - 应用程序设置三个变量以控制如何填充渐变框:
colors
:将渐变颜色设置为纯红和纯蓝范围之间。alphas
:将不透明度设置为纯色。ratios
:将红色和蓝色的颜色分布设置为相同。
- 应用程序调用图形方法
beginGradientFill()
(该方法作用于myMatrix
对象),并且调用lineTo()
方法,生成渐变填充框。
package { import flash.geom.Matrix; import flash.display.Sprite; import flash.display.GradientType; public class MatrixExample extends Sprite { public function MatrixExample() { var myMatrix:Matrix = new Matrix(); trace(myMatrix.toString()); // (a=1, b=0, c=0, d=1, tx=0, ty=0) myMatrix.createGradientBox(200, 200, 0, 50, 50); trace(myMatrix.toString()); // (a=0.1220703125, b=0, c=0, d=0.1220703125, tx=150, ty=150) var colors:Array = [0xFF0000, 0x0000FF]; var alphas:Array = [1, 1]; var ratios:Array = [0, 0xFF]; graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, myMatrix); graphics.lineTo(0, 300); graphics.lineTo(300, 300); graphics.lineTo(300, 0); graphics.lineTo(0, 0); } } }
Tue Jun 12 2018, 11:04 AM Z