我有一个应用程序在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然后执行那里的行,它会工作。但是,我宁愿告诉它渲染屏幕然后继续我的代码。这可能吗?它看起来更优雅。
答案 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
}