[as3][翻译]改变大小、缩放对象
[注]本文中这些内容需要注意:缩放属性scaleX、scaleY与AS2.0中的_xscale、_yscale取值范围不同;如何控制缩放时不变形。
有两种方式可以测量和改变一个display对象的大小,一种是使用尺寸属性(width和height),另一种是使用缩放属性(scaleX和scaleY)。
每个display对象都有一个width属性和一个height属性,它们的初始值就是以像素为单位的该对象的大小。你可以读取这两个属性的值来测量display对象的尺寸,也可以赋给它们新值以改变display对象的大小,如下所示:
- // Resize a display object.
- square.width = 420;
- square.height = 420;
- // Determine the radius of a circle display object.
- var radius:Number = circle.width / 2;
改变display对象的高度和宽度,将缩放该对象,也就是说它会被拉伸或者压扁,以便能填充到新区域中。如果display对象中只有矢量图形,那么会按照新的缩放值重绘这些图形,并且质量不会下降。但是display对象中的任何位图元素将会被缩放而不是重绘。因此如果一个数码照片的宽度和高度比它真实尺寸大的时候,会显示处很多锯齿。
当改变display对象的width和height属性的时候,FlashPlayer会同时改变它的scaleX和scaleY属性。这些属性的值等于相对大小比上原始大小。scaleX和scaleY属性使用十进制小数表示百分比。比如如果一个display对象的宽度变成了原来的一半,那么它的scaleX属性值就是0.5,也就是50%。如果它的高度编程了原来的2倍,那么它的scaleY属性值就是2,也就是200%。
- // circle is a display object whose width and height are 150 pixels.
- // At original size, scaleX and scaleY are 1 (100%).
- trace(circle.scaleX); // output: 1
- trace(circle.scaleY); // output: 1
- // When you change the width and height properties,
- // Flash Player changes the scaleX and scaleY properties accordingly.
- circle.width = 100;
- circle.height = 75;
- trace(circle.scaleX); // output: 0.6622516556291391
- trace(circle.scaleY); // output: 0.4966887417218543
大小并不是按比例改变的。换句话说,如果你改变了一个正方形的高度而保持宽度不变的话,那么图形将变成一个矩形而不再是正方形。如果你想保持它的形状,你可以设置它的scaleX和scaleY属性来改变大小。比如,下面的代码改变了名为square的宽度,然后又把垂直缩放(scaleY)改变成相应的值,这样就保持了它的形状:
- // Change the width directly.
- square.width = 150;
- // Change the vertical scale to match the horizontal scale,
- // to keep the size proportional.
- square.scaleY = square.scaleX;
缩放的中控制扭曲变形
一般情况下,当缩放一个display对象的时候(比如水平拉伸),整个对象都会变形,因此每一部分都被拉伸相同的值。对于图形和设计元素,这可能就是你想要的效果。但是有时候需要让一部分变形而另外的部分保持原样会更好。一个常见的例子就是一个有圆角的矩形按钮。普通缩放时,按钮的角也会被拉伸,因此当按钮缩放的时候圆角的半径就变了。

但是,这种情况下我们更希望控制下缩放——最好是指定哪些区域应该缩放(直边和中间部分),哪些不应该缩放(角处)——,这样才不影响视觉效果。

如果想控制一个display对象如何缩放,可以使用9切片缩放(Scale-9)来创建对象。使用9切片缩放,display对象被分割成9块独立的矩形(一个3×3的格子)。这些矩形可以不一样大——你可以决定网格线放在什么位置。当缩放display对象的时候位于4个角里的内容将不会被拉伸,也不会被压缩。上边中间的角和下边中间的角会水平缩放,但不会垂直缩放,同样左边中间和右边中间的角只会垂直缩放而不会水平缩放。中间的部分既水平缩放也垂直缩放。

记住,如果你想让display对象的某个部分不会被缩放,那么就要把这部分放到9切片缩放的某个角里。
在AS中,设置一个display对象的scale9Grid属性就会打开它的9切片缩放,并设置了Scale-9网格。要使用Rectangle类的一个实例赋给scale9Grid属性,如下所示:
- myButton.scale9Grid = new Rectangle(32, 27, 71, 64);
Rectangle构造函数的4个参数分别值得是x坐标、y坐标、宽度和高度。在这个例子中,这个矩形的左上角在myButton的x:32,y:27这个点处。矩形宽71像素,高65像素(因此它的右边界是x坐标103处,下边界在y坐标92处)。

这个矩形定义的是9切片网格的中心部分。FlashPlayer会通过延长这个矩形的边得到其他矩形,想下面这样:

在这种情况下,当按钮缩放的时候,圆角就不会被拉伸也不会被压缩,但是其他部分会被响应的调整:


Leave a Reply