0

我有一个在 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 返回状态改变前的高度,但在函数执行后就不同了。

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

4

2 回答 2

2

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

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

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

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

于 2012-12-12T00:07:26.827 回答
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
}
于 2012-12-12T00:13:02.567 回答