变化国家会立即在Flex中进行更改

时间:2012-12-11 21:21:17

标签: actionscript-3 flex actionscript flex4.6

我有一个应用程序在Flex中的不同图形之间切换。每个图表都是它自己的状态。在MXML中我设置了它,以便在状态改变时图像源发生变化:

<s:Image id="chartImage"
         source.all="{ callImages.all }"
         source.classA="{ callImages.classB }"
         source.classB="{ callImages.classA }"
         />

我有成功更改图像的按钮。但是,我有一个小错误,因为在行

之后
this.currentState = chartName;

我的代码期望图形图像源被更改,但是对于s:Image元素的实际更改似乎在函数结束并且屏幕更新之后才会发生,我假设。因此,当它抓取chartImage.height时,它会使用我刚离开的状态中的旧状态。

有没有办法让它获得新图像(因此它的尺寸),所以我可以在下一行用这些尺寸进行计算?到目前为止,chartImage.height返回状态更改之前的高度,但在函数执行后它会有所不同。

我可以在几分之一秒后运行一个timmer然后执行那里的行,它会工作。但是,我宁愿告诉它渲染屏幕然后继续我的代码。这可能吗?它看起来更优雅。

2 个答案:

答案 0 :(得分:2)

  

有没有办法让它获得新图像(因此它的尺寸)   所以我可以在下一行用这些尺寸进行计算?

每个Flex组件都必须经过它自己的验证周期,该周期建立在Flash Player的渲染机制之上。如果您对Flash/Flex Elastic Racetrack执行Google搜索,则会有一些很棒的帖子。

但是,您可以通过调用validateNow()方法以线性方式强制组件运行其验证方法。

有可能 - 特别是如果你有状态转换 - 在设置currentState变量后,Image上的属性还没有改变。

答案 1 :(得分:1)

您通常无法在Flex中更改图像的来源,然后立即检查(“在下一行”)它的高度 - 例外情况可能是源是原始位图,但即使这样,Flex的布局框架也将因不同因素而异,所以我不会依赖于此。

这是Flex的经典问题:框架的美感(和痛苦)是它逐步呈现它的变化以最大化应用程序的响应能力。谷歌“灵活组件生命周期”为大量关于此过程细节的资源。

有几种方法可以解决这个问题。通常你会想要使用绑定表达式,因为它们的设计正是出于这个原因:异步布局更改。不要过度使用它们,但它们是保持代码库简单灵活的可靠工具。

您可以通过mxml:

绑定到SparkImage的高度
<s:Image id="chartImage" />
<s:Label id="debugLabel" text="{ 'Height of chartImage: ' + chartImage.height }" />

但是如果你需要运行逻辑我建议使用BindingUtils(在脚本块中):

import mx.binding.utils.BindingUtils;

protected function someOtherFunctionBlock():void
{
    BindingUtils.bindSetter( handleHeigtChange, image, "height" );
}

protected function handleHeigtChange( value:Number ):void
{
   // Deal with value change
}