我遗漏了一些关于 Flex 中图表的基本知识。我正在创建一个自定义图表组件,其中包含自动缩放功能,该功能可以修改图表的 x 轴和 y 轴限制,并为图表提供新的数据系列。自定义图表组件如下所示:
<s:Group ...>
...
private function autoScale():void {
...
// this is where I compute newXmin, newXmax, newYmin, newYmax, startIndex, endIndex
...
haxis.minimum = newXmin;
haxis.maximum = newXmax;
vaxis.minimum = newYmin;
vaxis.maximum = newYmax;
myChart.series.dataProvider = myData.slice(startIndex, endIndex+1);
}
...
<mx:LineChart id="myChart">
<mx:horizontalAxis>
<charts:MyAxis id="haxis" labelFunction="setXLabels()"/>
</mx:horizontalAxis>
<mx:verticalAxis>
<mx:LinearAxis id="vaxis" labelFunction="setYLabels()"/>
</mx:verticalAxis>
</mx:LineChart>
...
</s:Group>
用户可以随时放大/缩小(代码未显示),这会调用 autoScale()
函数。
我的想法是,如果我错了,请纠正我,上面的程序重新绘制图表五次(对于函数 autoScale()
中显示的每行代码一次。是否可能告诉 Flex 忽略对组件的重新绘制更改,直到我发出一些特定的命令,“好吧,现在我已经设置了所需的一切 - 继续重新绘制图表”?
我一直在阅读有关 invalidateDisplayList
的内容,但无法弄清楚这是否是它的预期应用程序,如果是,如何在此处应用它。我只在用于将数据传入/传出自定义组件的 set
和 get
函数中看到过将 invalidateDisplayList
应用于自定义组件( see here ,例如)。在上面的示例中,我正在讨论的属性都是在自定义组件内部设置的(例如在 autoScale()
函数中)。不确定这是否会产生影响。
任何建议表示赞赏。
最佳答案
Flex 的组件生命周期将防止图表被重绘 5 次,因为属性在您所描述的语句中被修改了 5 次,这就是生命周期的美妙之处。
简而言之,大多数属性更改不会立即转化为绘图,而是会引发一个标志来指示属性已更改,此过程称为失效。然后,该组件将等待下一个重绘周期,通常是一帧之后(Flash 是基于帧的动画环境)。当重绘发生时,代码可以整体评估所有情况。
Flex 的生命周期提供细粒度的失效。开发者可以选择 invalidateProperties()
、invalidationSize()
、invalidatDisplayList()
和 invalidateSkinState()
(对于 Spark)成分)。当 Flex 经历“验证”这些失效的生命周期时,commitProperties()
、measure()
、updateDisplayList(w, h)
、getCurrentSkinState()
将被调用来执行验证。您可以找到有关组件生命周期的更多信息 here , here ,和here .
就您的情况而言,您不必自行无效,除非图表组件没有正确地使某些属性无效,否则您不需要调用 invalidate 或 validate 方法。
关于actionscript-3 - 弹性/AS3 : how to manage re-draw of chart when changing multiple chart properties?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11632002/