0

采用以下 AS3/MXML 代码:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark" xmlns="*"
        backgroundColor="#000000" showStatusBar="false" width="400" height="400"
        minWidth="0" minHeight="0">
    <s:Rect width="50%" height="50%">
        <s:fill>
            <s:SolidColor color="#0000FF"/>
        </s:fill>
    </s:Rect>
</s:WindowedApplication>

这主要是有效的。当我增加或减少程序的大小时,Rect 的大小将缩放为 WindowedApplication 的宽度和高度的 50%。但是当我不断减小窗口的高度时,缩小会停止几个像素小于 0。这是尽可能小,因为我可以让 Rect 沿着 y 轴:

在此处输入图像描述

在它达到这一点之后,即使我不断减小 WindowedApplication 的大小,也没有任何反应。Rect 保持完全相同的高度,直到我再次开始增加窗口的大小。更重要的是, Rect 的高度是 12 像素,对于它来说这是一个相当随意的数字。

但是,如果我改变:

    <s:Rect width="50%" height="50%">

至:

    <s:Rect width="{width / 2}" height="{height / 2}">

问题神奇地消失了:

在此处输入图像描述

WindowedApplication 的高度是 5,而 Rect 的高度大约是“两个半”。

为什么会有这样的区别?在前面的示例中,我确实尝试过增加大小,然后再次减小大小几次,甚至是缓慢的,但它总是卡在同一个位置。谢谢!

4

1 回答 1

6

这里实际上有几个单独的属性在起作用:

  • 高度
  • 百分比高度
  • 显式高度

高度实际上只是percentHeight 和explicitHeight 后面的一些烟雾和镜子。

在第一种方法中,即使您在 MXML 中将高度属性指定为百分比;Flex 编译器在幕后做了一些魔术来检查百分比字符“%”并设置 percentHeight 属性而不是宽度。

由于在设置百分比高度时没有给出明确的高度;s:Rect 的 validateSize() 方法应该执行。该方法似乎与 Flex 组件生命周期的 measure() 方法类似。

validateSize() 方法对 explicitMinHeight 属性进行一些检查

if (!isNaN(explicitMinHeight) && measuredHeight < explicitMinHeight)
    measuredHeight = explicitMinHeight;

所以,本质上,有一个最小高度;组件的高度不会低于该高度。

但是,在您的第二种方法中,您没有指定百分比,而是指定了实际值。因此设置了explicitHeight 值。因为设置了一个明确的高度,它具有优先级,并且不需要执行 validateSize() 方法。validateSize() 中的这一行跳过了它:

if (!canSkipMeasurement())
    measure();

protected function canSkipMeasurement():Boolean
{
    return !isNaN(explicitWidth) && !isNaN(explicitHeight);
}

所以,希望这是有道理的。

总之; 如果您设置百分比高度;然后 Flex 计算高度并且有一个最小值。如果您设置了明确的高度;然后 Flex 使用该值并跳过它自己的内部计算。

[我只是粗略地回顾了 Flex 框架代码,所以你必须回顾代码才能更深入地挖掘]

于 2013-10-08T16:31:26.273 回答