scale DisplayObject与width之间的关系

时间:2012-11-08 12:21:16

标签: actionscript-3 flash flex flex4 flex3

事件如果容器被缩放,它本身及其子节点都不会改变宽度值,那么它们如何改变它们的宽度呢?

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Script>
        <![CDATA[
            private function scaleOutContainer():void {
                outerContainer.scaleX = slider.value;
                trace("outerContainer.width: " + outerContainer.width);
                trace("outerContainer.scaleX: " + outerContainer.scaleX);
                trace("image width: " + fotoImig.width);
                trace("image scaleX: " + fotoImig.scaleX);
                var containerBound:Rectangle = outerContainer.getBounds(this);
                trace(containerBound);
                trace("=====================");
            }
        ]]>
    </fx:Script>
        <s:Group id="outerContainer" left="50" top="80" width="500">
            <s:layout>
                <s:VerticalLayout/>
            </s:layout>
            <s:BitmapImage id="fotoImig" source="@Embed('assets/foto.jpg')"/>
            <s:Label id="info" text="Test Scale"/>
        </s:Group>
        <s:HGroup left="50" top="50">
            <s:Label text="scale outContainer"/><s:HSlider id="slider" snapInterval="0.1" value="1" change="scaleOutContainer()"/>
        </s:HGroup>
</s:Application>

2 个答案:

答案 0 :(得分:0)

scaleXscaleY不会以任何方式影响对象的实际大小。缩放属性只是修改它们在屏幕上的显示方式。对于该应用程序,该50x50的盒子仍然是50x50,即使它在scaleX = scaleY = 4的屏幕上看起来是200x200。

缩放是以这种方式完成的,因此原始大小永远不会丢失。这样,您可以反复自由缩放对象,并始终相对于原始大小。

我不确定比例属性实际上是如何工作的。如果您实际挖掘DisplayObject的某些属性,则有多个宽度值(width,measuredWidth,explicitWidth,加上UIComponent中的percentWidth)。我的猜测(遗憾的是纯粹的猜测)是这些值中的一个被改变而宽度/高度值保持不变。

如果需要缩放对象的宽度/高度值,可以将宽度/高度值乘以各自的缩放属性。

答案 1 :(得分:0)

每个DisplayObject只有转换矩阵(在object.transform.matrix上可用)。值,例如x,y,scaleX,scaleY,rotation,width,height ......只是setter / getter函数,可以使用矩阵。

E.g。 scaleX getter是Math.sqrt(m[0]*m[0] + m[1]*m[1] + m[2]*m[2]);,它对应于具有由第一行变换矩阵定义的大小的box的对角线。

宽度 getter为o.getBounds(o.parent).width

身高 getter为o.getBounds(o.parent).height

但我仍然不明白,宽度和高度设置器的工作原理。 E.g。

var rect = new Sprite();
rect.graphics.drawRect(0,0,100,100);
rect.rotation = 20;
trace(rect.width);  // 128.15
rect.width = 80;
trace(rect.width);  // 92.85
rect.width = 80;
trace(rect.width);  // 89.4