【问题标题】:Flex 3 - Get the actual size of a componentFlex 3 - 获取组件的实际大小
【发布时间】:2011-06-11 19:32:42
【问题描述】:

我想在添加一些子元素后获取组件的实际高度。

在调试模式下检查变量选项卡时,我看到 2 个不同的高度变量: $height(包含正确值:138)和 height/_height(包含错误值:10)。

我猜显示没有更新,所以我没有使用 component.height 获得正确的高度,但我怎样才能获得 $height 中的值?

感谢您提供的任何帮助 =)

问候, BS_C3


@Flextras

再次感谢您的回答!说的很详细=)

Measuredheight 没有给我我正在寻找的值,并且 explicitHeight 没有值 (NaN)。我现在无法测试,所以我无法判断 unscaledHeight...

这是我所拥有的结构:

MainContainer - Canvas
    BOX1 - Canvas (height = 100)
    BOX2 - Canvas (height = 100)
    VariableBox - Canvas (height: depends on the height of it's variable number of children)
    Text - TextArea

我需要变量框的高度来定位文本。

函数如下所示:

updateDisplay(){
    for(i;i<list.length;i++){
        VariableBox.addChild(new HBox);
    }
    // reposition Text depending on VariableBox's height
}

我知道我没有提供任何代码,但我现在不在我的工作计算机上>_

希望这会有所帮助!

【问题讨论】:

    标签: apache-flex components


    【解决方案1】:

    简答:使用getMeasuredOrExplicitWidth()getMeasuredOrExplicitHeight() 方法。

    在许多情况下,heightwidth 将返回与这些方法相同的值。

    更长的答案: 你用的是什么组件?由于您使用 Flex 标记了它,我将假设它是扩展 UIComponent 的 Flex 可视组件。

    您有几个不同的高度值可供查看,但请记住,父母始终有责任确定其孩子的大小。向组件添加子组件不一定会改变它的高度或宽度。这取决于您要添加子级的组件是否考虑到子级。

    首先看看measuredHeightmeasuredWidth。这些是使用测量方法计算的组件的首选尺寸值。某些组件,例如 HBox 或 VBox 会自动“感知”它们的子组件,并在计算其大小时使用这些组件。其他组件(例如 UIComponent)在设置 measureHeight 或 measureWidth 时不考虑子级。

    其次,你可以看看explicitHeight和explicitWidth。如果设置高度或宽度,则设置这些值。如果您使用 setActualSize() 方法,我不相信这些值是设置的。引擎盖下有一些魔法,所以explicitHeightexplicitWidth 被隐藏在高度和宽度后面。它们通常相同,但并非总是如此。

    我通常不处理缩放,但如果您需要组件的未缩放高度和宽度,则组件的 unscaledWidthunscaledHeight 受保护属性。我相信这些是传递给 updateDisplayList() 方法的值。

    请记住,要让组件在添加或删除子项后调整自身大小,该组件必须经历其自己的生命周期。所以这段代码:

    trace(container.width);
    container.addChild(myChild);
    trace(container.width);
    

    可能不会改变容器的宽度,因为容器还没有机会运行 measure()、updateDisplayList() 或 commitProperties() 方法。

    如果这没有帮助,您将不得不变得更具体并提供一些代码。

    【讨论】:

    • 回到电脑前,一定要提供一些实际的代码。但是,我强烈建议不要在 updateDisplayList 中添加子项。在 createChildren 中执行此操作 - 如果您在初始组件创建后执行此操作,则可能是 commitProperties。
    • 终于不需要了 =) 再次感谢^^
    【解决方案2】:

    最终解决方案:

    我终于找到了一些让我满意的解决方法,而无需做一些奢侈的事情......

    我有一个父容器,我正在向其中动态添加一些子容器,但它的高度没有更新。我遇到的问题是父容器的measuredHeight、explicitHeight、height 和unscaledHeight 都没有给我我想要的高度。

    所以,我为每个孩子的 creationComplete 添加了一个侦听器。一旦创建完成事件启动,子项的每个控制都会被考虑在内。此时,父容器的measuredHeight被设置为期望值。所以我只需要设置:

    parentContainer.height = parentContainer.measuredHeight
    

    再次感谢提供一些有用信息的 Flextras =)

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      相关资源
      最近更新 更多