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>

现在,如果我在第二个按钮中设置 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

在纯 Actionscript 中是否有一些等效的实现可以在“myAnotherBox”上重现此行为?

我已经尝试过:

  • 改变变换矩阵;
  • 改变变换pixelBounds;
  • 改变滚动矩形;
  • 敷面膜;

而且没有成功。

干杯...

4

3 回答 3

1

您正在尝试与不同的事物进行比较。在第一个示例中,宽度和高度来自 UIComponent 类,它实际上表示 Flex 框架提供的“测量”值。

在第二种情况下,宽度和高度是 Flash Player 提供的渲染形状的实际大小。

如果你打开 UIComponent 的实现,你会发现它实际上是把 width 和 height 的本来含义隐藏在 $width 和 $height 中,并为其提供了自己的实现。

因此,要回答您的问题,您无法直接使用 Shapes(纯 Flash 组件)实现您想要的效果,每次您在图形上下文中绘制某些东西时,宽度和高度都会相应地更新。

您的选择:

  1. 在一个图形中绘制第一个图形,在另一个图形中绘制第二个图形并仅测量第一个形状

  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,则不会重新计算其父级的大小及其大小。失效是原生的flex框架机制,在纯AS项目中是不存在的。

于 2011-02-20T13:49:32.057 回答