Actionscript 3 在AS3/MXML中,为什么绑定组件';s height to height/2比将其绑定到50%更有效?

Actionscript 3 在AS3/MXML中,为什么绑定组件';s height to height/2比将其绑定到50%更有效?,actionscript-3,flash,apache-flex,air,mxml,Actionscript 3,Flash,Apache Flex,Air,Mxml,采用以下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" widt

采用以下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不到几个像素的像素停止。这是我能得到的沿y轴的矩形的最小值:

在达到这一点之后,即使我不断减小WindowedApplication的大小,也不会发生任何事情。在我再次开始增加窗口大小之前,矩形保持在完全相同的高度。更重要的是,Rect的高度是12像素,这对于它来说是一个非常任意的数字

但是,如果我改变:

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

致:


问题神奇地消失了:

WindowedApplication的高度为5,Rect的高度约为“2.5”


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

这里实际上有几个单独的属性:

  • 高度
  • 百分高度
  • 明确的
高度实际上只是百分比高度和明暗度后面的一些烟雾和镜子

在第一种方法中,即使将height属性指定为MXML中的百分比;Flex编译器在后台执行了一些神奇的操作来检查百分比字符“%”,并设置percentHeight属性而不是width

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

validateSize()方法对explicitMinHight属性执行一些检查

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

所以,希望这是有意义的

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


[我只是粗略地回顾了Flex框架代码,因此您必须回顾代码才能更深入地了解]

这里实际上有几个单独的属性:

  • 高度
  • 百分高度
  • 明确的
高度实际上只是百分比高度和明暗度后面的一些烟雾和镜子

在第一种方法中,即使将height属性指定为MXML中的百分比;Flex编译器在后台执行了一些神奇的操作来检查百分比字符“%”,并设置percentHeight属性而不是width

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

validateSize()方法对explicitMinHight属性执行一些检查

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

所以,希望这是有意义的

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


[我只是粗略地回顾了Flex框架代码,因此您必须回顾代码才能更深入地了解]

我认为您发现了一个bug!:)@StephenNYC我不同意[更多细节请参见我的答案]我认为您发现了一个bug!:)@StephenNYC我不同意[参见我的答案了解更多细节]minWidth和minHeight被设置为零,但百分比方法没有如预期的那样工作,正如您所确认的,它似乎有一个内部最小值。。。那么这是一个bug?@StephenNYC没有花比我想花更多的时间来检查代码;我不会把它叫做虫子。我不知道最小身高/测量的最小身高/明确的最小身高之间的关系。记住“家长”总是负责衡量孩子的大小;因此也可能有一些因素——尽管看起来提供的示例使用了基本布局;所以这不应该是一个问题。minWidth和minHeight设置为零,但百分比方法无法按预期工作,正如您所确认的,它似乎有一个内部最小值。。。那么这是一个bug?@StephenNYC没有花比我想花更多的时间来检查代码;我不会把它叫做虫子。我不知道最小身高/测量的最小身高/明确的最小身高之间的关系。记住“家长”总是负责衡量孩子的大小;因此也可能有一些因素——尽管看起来提供的示例使用了基本布局;所以这不应该是个问题。
if (!canSkipMeasurement())
    measure();
protected function canSkipMeasurement():Boolean
{
    return !isNaN(explicitWidth) && !isNaN(explicitHeight);
}