2

我遗漏了有关在 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,但无法弄清楚这是否是它的预期应用程序,如果是,如何在此处应用它。我只见过在用于将数据传入/传出自invalidateDisplayList定义组件的set函数中应用于自定义组件(例如,请参见此处)。在我上面的例子中,我正在讨论的属性都是在自定义组件中设置的(例如在函数中)。不确定这是否会有所作为。getautoScale()

任何建议表示赞赏。

4

1 回答 1

4

Flex 的组件生命周期将防止图表被重绘 5 次,因为属性在您描述的语句中被修改了 5 次,这就是生命周期的美妙之处。

简而言之,大多数属性更改不会立即转换为绘图,而是会引发一个标志,指示属性已更改,这样的过程称为失效。然后组件将等到下一个重绘周期,通常是一帧之后(Flash 是基于帧的动画环境)。当重绘发生时,代码可以整体评估所有情况。

Flex 的生命周期提供了细粒度的失效。开发人员可以从 invalidateProperties()invalidationSize()和(对于 Spark 组件)中进行invalidatDisplayList()选择 。invalidateSkinState()当 Flex 经历“验证”这些失效的生命周期时commitProperties(),将调用 , , 来执行measure()验证updateDisplayList(w, h)您可以在此处此处此处getCurrentSkinState()找到有关组件生命周期的更多信息。

在您的情况下,您不必自己使无效,除非图表组件没有正确使某些属性无效,否则您不需要调用无效或验证方法。

于 2012-07-24T14:11:47.220 回答