2

Flex を知っている場合は、「includeInLayout」プロパティが何をするかをおそらく知っているでしょう。そうでない場合、このプロパティは、コンポーネントの親が独自の境界をレンダリングする際にコンポーネントの境界 (幅や高さなど) を無視するようにします。

以下の参照の説明:

このコンポーネントを親コンテナーのレイアウトに含めるかどうかを指定します。true の場合、オブジェクトはその親コン​​テナーのレイアウトに含まれ、そのレイアウト ルールに従って親コンテナーによってサイズ変更および配置されます。false の場合、オブジェクトのサイズと位置は親コンテナーのレイアウトの影響を受けません。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/UIComponent.html#includeInLayout

たとえば、Flex では次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                layout="absolute"
                creationComplete="application1_creationCompleteHandler(event)">
    <mx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function application1_creationCompleteHandler( event:FlexEvent ):void
            {
                trace( container.width, container.height ); // output: 200 200
            }
        ]]>
    </mx:Script>
    <mx:Canvas id="container">
        <mx:Button label="Test"
                   width="100"
                   height="100" />
        <mx:Button label="Test2"
                   width="200"
                   height="200" />
    </mx:Canvas>
</mx:Application>

2 番目のボタンに includeInLayout="false" を設定すると、次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                layout="absolute"
                creationComplete="application1_creationCompleteHandler(event)">
    <mx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function application1_creationCompleteHandler( event:FlexEvent ):void
            {
                trace( container.width, container.height ); // output: 100 100
            }
        ]]>
    </mx:Script>
    <mx:Canvas id="container">
        <mx:Button label="Test"
                   width="100"
                   height="100" />
        <mx:Button label="Test2"
                   width="200"
                   height="200"
                   includeInLayout="false" />
    </mx:Canvas>
</mx:Application>

私は、このプロパティの実装に関連するすべてのフレームワーク アーキテクチャを知っており、このプロパティが Flex Framework のプロパティであることを知っています。私が欲しいのは、純粋なアクションスクリプトでのこの動作です。例えば:

import flash.display.Shape;

var myBox:Shape = new Shape();

myBox.graphics.beginFill(0xFF0000);
myBox.graphics.drawRect(0, 0, 100, 100);
myBox.graphics.endFill();

addChild(myBox);

trace(width, height); // output: 100 100

var myAnotherBox:Shape = new Shape();

myAnotherBox.graphics.beginFill(0xFF00FF, .5);
myAnotherBox.graphics.drawRect(0, 0, 200, 200);
myAnotherBox.graphics.endFill();

addChild(myAnotherBox);

trace(width, height); // output: 200 200

「myAnotherBox」でこの動作を再現するために、純粋なActionscriptに同等の実装がありますか?

私はすでに試しました:

  • 変換行列を変更します。
  • 変換 pixelBounds を変更します。
  • scrollRect を変更します。
  • マスクを適用します。

そして、成功しません。

乾杯...

4

3 に答える 3

1

いろいろなものと比較しようとしています。最初の例では、幅と高さは UIComponent クラスからのもので、実際には Flex Framework によって提供される「測定された」値を表します。

2 番目のケースでは、幅と高さは、Flash Player によって提供されるレンダリングされた形状の実際のサイズです。

UIComponent の実装を開くと、実際には幅と高さの本来の意味が $width と $height に隠され、独自の実装が提供されていることがわかります。

あなたの質問に答えるために、図形 (純粋な Flash コンポーネント) を直接操作して目的を達成することはできません。グラフィックス コンテキストで何かを描画するたびに、それに応じて幅と高さが更新されます。

オプション:

  1. あるグラフィックスで最初のものを描き、別のグラフィックスで2番目のものを描き、最初の形状だけを測定する

  2. 幅と高さを自分で計算します。これはコンテナが実際に行うことであり、 includeInLayout=false 子コンポーネントをスキップするだけです。

于 2011-10-09T22:01:17.437 に答える
0

コンテナの幅と高さをオーバーライドする必要があります。

override public function get width() : Number {
    // place your code here
    return 100;
}

override public function get height() : Number {
    // place your code here
    return 100;
}
于 2011-04-18T13:11:29.083 に答える
0

UIComponent のソース コードを調べると、includeInLayout フラグが無効化メカニズムで使用されていることがわかります (サイズの無効化で正確に)。コンポーネントの includeInLayout が false の場合、その親のサイズとそのサイズは再計算されません。無効化はネイティブのフレックス フレームワーク メカニズムであり、純粋な AS プロジェクトには存在しません。

于 2011-02-20T13:49:32.057 に答える