0

コンテナがスケーリングされている場合、それ自体とその子の両方が幅の値を変更しない場合、どうすれば幅を変更できますか?

<?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>
4

2 に答える 2

0

scaleXオブジェクトの実際のサイズにはまったく影響しscaleYません。スケール プロパティは、画面上での表示方法を変更するだけです。アプリケーションにとって、その 50x50 ボックスは、画面上では 200x200 のように見えても、依然として 50x50scaleX = scaleY = 4です。

スケーリングはこの方法で行われるため、元のサイズが失われることはありません。このようにして、オブジェクトを常に元のサイズに相対的に自由に繰り返しスケーリングできます。

スケール プロパティが実際にどのように機能するかはわかりません。のプロパティのいくつかを実際に掘り下げると、DisplayObject複数の幅の値があります (width、measuredWidth、explicitWidth、および の percentWidth UIComponent)。私の推測 (残念ながら純粋な推測) は、幅/高さの値が同じままで、これらの値の 1 つが変更されているということです。

スケーリングされたオブジェクトの幅/高さの値が必要な場合は、幅/高さの値にそれぞれのスケール プロパティを掛けるだけです。

于 2012-11-08T16:15:42.330 に答える
0

各 DisplayObject には、変換マトリックスのみがあります (object.transform.matrix で入手可能)。x、y、scaleX、scaleY、rotation、width、height などの値は、マトリックスで機能する単なるセッター/ゲッター関数です。

たとえば、scaleX ゲッターはMath.sqrt(m[0]*m[0] + m[1]*m[1] + m[2]*m[2]);、変換行列の最初の行で定義されたサイズを持つボックスの対角線に対応します。

ゲッターはo.getBounds(o.parent).width

高さゲッターはo.getBounds(o.parent).height

しかし、幅と高さのセッターがどのように機能するかはまだわかりません。例えば

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
于 2014-07-04T22:23:52.393 に答える