4

我正在尝试使用 Flex 组件框架创建自定义 Flex 组件:

http://www.adobe.com/livedocs/flex/3/html/help.html?content=ascomponents_advanced_3.html

所有好的组件都允许您使用百分比值定义它们的尺寸,方法是:

MXML:

文本输入宽度=“100%”

或者

运行时的动作脚本:

textinp.percentWidth = 100;

我的问题是如何在自定义组件的 measure() 方法中实现百分比宽度/高度?更具体地说,这些百分比在某个阶段转换为像素值,这是如何完成的?

4

1 回答 1

6

Flex 布局的工作方式是让每个组件将其子组件布置为父组件指定的大小。“Children”确实包括通常的孩子——getChildren()、numChildren——以及构成边框、句柄等的那些组件,它们被称为“chrome”并且是getRawChildren() 的一部分。

Flex 框架现在对所有组件(实际上是显示树的一部分)进行两次循环。第一种是自下而上(首先是最深的嵌套元素)并调用 measure() 方法。它应该计算组件需要多少空间(宽度/高度),如果它可以拥有尽可能多的空间,没有限制(想想:滚动条)并将其放入 measureWidth 和 measureHeight 属性。其次,它计算它想要拥有多少空间作为绝对最小值,并将其放入measuredMinHeight/measuredMinWidth。为了计算这一点,使用 getExplicitOrMeasuredHeight()/Width() 询问边框厚度、镀铬和常规子项的大小,并将它们相加。这就是为什么它是深度优先的。

第二个循环是进行实际布局。这从树的顶部开始,然后调用 updateDisplayList,x/y 参数告诉组件它实际上有多少大小。基于此信息,组件将告诉其直接子级他们应该在哪里(相对于他们的父母)以及他们应该有多大 - child.move(x,y) 和 child.setActualSize(w,h)

所以实际上是父容器考虑了相对大小。您的组件在 measure() 中声明它是理想的(最小尺寸,以便可以显示所有内容)和最小尺寸,并且必须处理它在 updateDisplayList() 中获得的任何内容。父组件占用它拥有的可用空间,确保每个组件都获得它的最小尺寸,然后将其余部分分配给所有组件。在此阶段,它将查看其子项的 percentWidth/Height 属性。

所以如果你想把你的组件放在一个标准的 Flex 容器中,比如 HBox,你不需要做任何特殊的事情来让百分比大小起作用。

于 2010-06-22T10:55:06.517 回答