zoukankan      html  css  js  c++  java
  • Flex DataTransforms类的理解

    dataTransforms是flex里面chart包的一个类,这个类的作用是在数据和坐标之间进行转换。

    在flex的chart包里,数据是由ChartElement提供的,看一下所有chart的父类ChartBase,有一个protected 的成员变量叫做allElements,它就是一个ChartElement的数组,记录了该chart里的所有ChartElement类型。一个 chart里的ChartElement根据作用,可以分为series、background、annotation,分别记录在成员变量 _userSeries、_backgroundElements、_annotationElements里面,这三个成员变量和 allElements一样都是ChartElement的数组,但它们是private类型的,分别可以用get set series、get set backgroundElements、get set annotationElements来访问。allElement数组的内容等于series、backgroundElements、 annotationElements这三个数组之和,即

    allElement = series.concat(backgroundElements.concat(annotationElements.concat()));

    至于series、backgroundElements、annotationElements里面具体都是什么类型的 ChartElement,则是由子类来定义。比如ChartBase的子类CartesianChart,这是一个用于笛卡尔坐标系(简单的说,就是 xy轴,相区分于极坐标系)的子类,在CartesianChart的构造函数里就设置了

            var gridLines:GridLines = new GridLines();
            backgroundElements = [ gridLines ];

    当然,还可以在MXML里用<mx:Series>、<mx:BackgroundElements>和<mx:AnnotationElements>标签来设置chart里包含哪些ChartElement。

    ChartElement其实还是可视的图表单元的父类(The ChartElement class is the base class for visual chart elements),它继承了DualStyleObject,而DualStyleObject又继承了UIComponent,因此 ChartElement实际上是继承了UIComponent的,UIComponent是flex上所有可视的类型的父类,一个类如果继承了 UIComponent,那它就是可视的,至少设计者是想让这个类可视的。这就是说,ChartElement是可视的,它会被添加到display list上去,每次事件发生后下一个frame刷新的时候redraw一遍。而事实上,ChartElement确实被加入到了ChartBase的 display list上。在ChartBase的构造函数里,初始化了 _seriesHolder,_backgroundElementsHolder,_annotationElementHolder这几个 UIComponent,然后调用addChild直接将这三个holder加为ChartBase的子结点,然后在updateSeries函数里会分 别将series、backgoundElements、annotationElement里的所有ChartElement用addChild添加为 对应的holder里的子结点,这样就建立好了display list,在图表绘制时,每个子结点的updateDisplayList都会被调用到,从而显示这个子结点的内容。

    前面说过ChartElement只是提供数据的,那么ChartElement是如何确定坐标的呢?在flex的chart包里,坐标位置是由 Axis来决定的,常用的Axis有NumericAxis的子类LinearAxis和DateTimeAxis。所有的Axis类都继承了 AxisBase类型并且实现IAxis接口。Axis的主要功能是确定在坐标轴上点与数据的对应关系,坐标轴可以抽象为【0,1】这么一个闭区间,0是 坐标轴的起点,0.25就是这个坐标轴1/4的位置,而0.5则是1/2的位置,1则是坐标轴的末端,那么坐标轴的开头对应多大的数据,末端对应多大的数 据,中间的每个位置上该对应多大的数据,都是由Axis来决定的。IAxis里有两个方法,transformCache和 invertTransform,分别是完成数据到坐标、坐标到数据的转换的,详细的可以看其java doc。

    再回到DataTransforms,DataTransforms里包含了一组ChartElement,还包含了一组Axis。 DataTransforms里包含的ChartElement和Axis也都包含了到DataTransforms的反向指针。 DataTransforms里提供了transformCache和invertTransform接口,这样,每个ChartElement在绘图 时,可以调用DataTransforms里的这两个接口来得到具体的坐标。DataTransforms相当于在数据和坐标之间搭起了一个桥梁。当 DataTransfroms里的ChartElement变化时,会调用所有Axis的dataChanged接口,当Axis变化时,会调用 ChartElement的mappingChanged接口。

  • 相关阅读:
    Tarjan之求LCA
    最近公共祖先(LCA)
    『Tarjan』Tarjan求强连通分量模板
    「LCA + 树上差分」[USACO15DEC]最大流Max Flow
    『主席树』可持久化线段树模板
    「树状数组」[SDOI2009]HH的项链
    「LCA」仓鼠找sugar
    「线段树」[JSOI2008]最大数
    「LCA + 最小生成树」货车运输
    『最小生成树』最小生成树模板
  • 原文地址:https://www.cnblogs.com/fxair/p/1721829.html
Copyright © 2011-2022 走看看