您的位置:首页 > 其它

在Flex几个通用Chart图形中画指定值的线条(指定刻度的线条)

2010-11-26 18:05 323 查看
在Flex几个通用Chart图形中画指定值的线条(指定刻度的线条)

问题来源:业务上要为Flex ColumnChart中画出一个以0这刻度的临界线。
问题分析:但是对Chart的backgroundElements中默认是GridLines,没有可用的用于指定刻度的线条,于是自己加了个HRule对象。
问题解决:加入HRule,设置它不同于GridLines的颜色,当然可以通过strokeWidth设置它的宽度,默认是2px,最重要的是设置它的位置。如下详细分析:

算出刻度的最大值和最小值:
va.minimum = 38.6
va.maximum = 41.400000000000006
算出所画容器的高度:
Father componnet height = 475

想像图:



于是分析得到如下位置计算公式:
y="{(((axis_score.maximum + axis_score.minimum) / 2 - 0) / (axis_score.maximum - axis_score.minimum)) * cs_3.height}"

关键解决代码:

<mx:backgroundElements>
<mx:GridLines direction="horizontal" >
<mx:horizontalStroke>
<mx:Stroke color="black" weight="0" alpha="0.2" />
</mx:horizontalStroke>
</mx:GridLines>
<mx:HRule y="{(((va.maximum + va.minimum) / 2 - 41) / (va.maximum - va.minimum)) * ls.height}" strokeColor="0xff0000" shadowColor="0xff0000"/>
</mx:backgroundElements>


问题推广:本文只设计了HRule是横向的线条,同理,可以很方便设计出纵向的线条,可以指定在哪一个值的刻度线或叫作临界线,当然还可以添加多条指定值的线。

可以运行的Demo代码:

<?xml version="1.0"?>
<!-- http://blog.flexexamples.com/2007/11/15/changing-the-horizontal-grid-line-frequency-in-a-flex-linechart-control-using-the-horizontalchangecount-style/ -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
verticalAlign="middle"
backgroundColor="white" viewSourceURL="srcview/index.html">
<mx:XMLListCollection id="dp">
<mx:source>
<mx:XMLList>
<quote date="8/27/2007" open="40.38" close="40.81" />
<quote date="8/24/2007" open="40.5" close="40.41" />
<quote date="8/23/2007" open="40.82" close="40.6" />
<quote date="8/22/2007" open="40.4" close="40.77" />
<quote date="8/21/2007" open="40.41" close="40.13" />
<quote date="8/20/2007" open="40.55" close="40.74" />
<quote date="8/17/2007" open="40.18" close="40.32" />
<quote date="8/16/2007" open="39.83" close="39.96" />
<quote date="8/15/2007" open="40.22" close="40.18" />
<quote date="8/14/2007" open="41.01" close="40.41" />
<quote date="8/13/2007" open="41" close="40.83" />
<quote date="8/10/2007" open="41.3" close="41.06" />
<quote date="8/9/2007" open="39.9" close="40.75" />
<quote date="8/8/2007" open="39.61" close="40.23" />
<quote date="8/7/2007" open="39.08" close="39.42" />
<quote date="8/6/2007" open="38.71" close="39.38" />
<quote date="8/3/2007" open="39.47" close="38.75" />
<quote date="8/2/2007" open="39.4" close="39.52" />
<quote date="8/1/2007" open="40.29" close="39.58" />
</mx:XMLList>
</mx:source>
</mx:XMLListCollection>

<mx:LineChart id="lineChart"
showDataTips="true"
dataProvider="{dp}"
width="100%"
height="100%">

<mx:backgroundElements>
<mx:GridLines direction="horizontal" >
<mx:horizontalStroke>
<mx:Stroke color="black" weight="0" alpha="0.2" />
</mx:horizontalStroke>
</mx:GridLines>
<mx:HRule y="{(((va.maximum + va.minimum) / 2 - 41) / (va.maximum - va.minimum)) * ls.height}" strokeColor="0xff0000" shadowColor="0xff0000"/>
</mx:backgroundElements>

<!-- vertical axis -->
<mx:verticalAxis>
<mx:LinearAxis id="va" baseAtZero="false" title="Price" />
</mx:verticalAxis>

<!-- horizontal axis -->
<mx:horizontalAxis>
<mx:CategoryAxis id="ca" categoryField="@date" title="Date" />
</mx:horizontalAxis>

<!-- horizontal axis renderer -->
<mx:horizontalAxisRenderers>
<mx:AxisRenderer axis="{ca}" canDropLabels="true" />
</mx:horizontalAxisRenderers>

<!-- series -->
<mx:series>
<mx:LineSeries id="ls" yField="@open" displayName="Open" />
</mx:series>
</mx:LineChart>

</mx:Application>


Demo效果图:



后记:

后来在编译时又发现了如下的警告:
Data binding will not be able to detect assignments to "maximum"
而且在实际动态处理数据时确实没有实时刷新过来。
我查看了LinearAxis类中的代码,发现maximum有get和set方法,是对computedMaximum进行处理,于是我直接写成:
y="{(((axis_score.computedMaximum + axis_score.computedMinimum) / 2 - 0) / (axis_score.computedMaximum - axis_score.computedMinimum)) * cs_3.height}"
但编译器还是报了同样的错误,这是因为我们在处理对LinearAxis对象加了[Bindable]还不够,还要在其定义的时候加入[Bindable],这样我只好要自己写一个继承LinearAxis类的子类。
但是我又不想这样,于是我写了个很笨的方法,那就是加了一个定时器,定时刷新LinearAxis对象的y偏移量,于是增加了如下代码:

protected var commitTimer:Timer = new Timer(1000, 1);/** 定时器 */


在应用程序初始化时加入如下代码:

/** 无奈的时间刷新零界线 */
commitTimer.addEventListener(TimerEvent.TIMER_COMPLETE, commitTimerCompleteHandler);
commitTimer.reset();
commitTimer.start();


并增加了如下定时刷新函数:

/** 定时刷新函数 */
protected function commitTimerCompleteHandler(event:TimerEvent):void
{
zeroLineHRule.y = (((axis_score.computedMaximum + axis_score.computedMinimum) / 2 - 0) / (axis_score.computedMaximum - axis_score.computedMinimum)) * cs_3.height;
commitTimer.reset();
commitTimer.start();
}


当然,我为那条横线增加了一个id属性,名字就叫做zeroLineHRule,如下代码所示:

<!-- 零界线 -->
<mx:HRule id="zeroLineHRule" y="{(((axis_score.computedMaximum + axis_score.computedMinimum) / 2 - 0) / (axis_score.computedMaximum - axis_score.computedMinimum)) * cs_3.height}" strokeColor="0xff0000" shadowColor="0xff0000" visible="{cb_1.selected || cb_2.selected || cb_3.selected}" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: