draw lines on ColumnChart
原文 http://blog.csdn.net/lixuekun820/article/details/5485042
Summary:
Adobe 的 Flex Chart提供了很强大的功能,通过简单的设置就可以实现一些较复杂的效果。比如通过ColumnSet将多个柱状图以overlaid形式显示,并添加条线图。但思想是无止境的,老外要求我们在柱状图上有斜线的效果等。
Requirement: ColumnChart 的能够显示线条,不同的柱状图显示不同的倾斜度、粗细及颜色。 Solution: 自定义ColumnSeries的itemRenderer. 定义 LinesRenderer.as 如下: package { import flash.display.Graphics; import flash.geom.Point; import mx.charts.renderers.BoxItemRenderer; public class LinesRenderer extends BoxItemRenderer { /** * properties: * lineGap is the gap between in lines * lineAngle is line's angle * */ public var lineGap : Number=4; public var lineAngle : Number = 75; /** * style settings: * linethickness * lineColor * lineAlpha * */ public var lineThickness : Number = 1; public var lineColor : uint = 0x000000; public var lineAlpha : Number = 1; /** * Private properties: * xIncreace: x add value * yIncreace: y add value * maxIncreace: the max value of increace * * */ private var xIncreace : Number; private var yIncreace : Number; private var maxIncreace : Number; private static const RADIAN_UINT : Number = Math.PI / 180; private var startPoint : Point = new Point(0, 0); private var endPoint : Point = new Point(0, 0); private var currentPoint : Point = new Point(0, 0); public function LinesRenderer() { super(); } override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth, unscaledHeight); if (this.height == 0 || this.width == 0) { return; } var g:Graphics=graphics; g.lineStyle(lineThickness, lineColor, lineAlpha); drawShadeLine(g); g.endFill(); } /** * draw lines function **/ private function drawShadeLine(g : Graphics) : void { var absHeight : Number = Math.abs(height); var absWidth : Number = Math.abs(width); currentPoint.x = 0; currentPoint.y = 0; if(lineAngle == 0) { if(height < 0) { currentPoint.y = - absHeight; } for(var i : int = 1; i * lineGap < absHeight; i++) { g.moveTo(currentPoint.x, currentPoint.y + i * lineGap); g.lineTo(currentPoint.x + absWidth, currentPoint.y + i * lineGap); } } else if(lineAngle == 90) { if(height < 0) { currentPoint.y = - absHeight; } for(var t : int = 1; t * lineGap < absHeight; t++) { g.moveTo(currentPoint.x + t * lineGap, currentPoint.y); g.lineTo(currentPoint.x + t * lineGap, currentPoint.y + absHeight); } } else if(lineAngle > 0 && lineAngle < 90) { if(height < 0) { currentPoint.y = - absHeight; } xIncreace = lineGap / Math.cos(lineAngle * RADIAN_UINT); yIncreace = lineGap / Math.sin(lineAngle * RADIAN_UINT); maxIncreace = Math.max(absHeight + absWidth/Math.tan(lineAngle * RADIAN_UINT) ,absWidth + absHeight * Math.tan(lineAngle * RADIAN_UINT)); for (var j:int = 1; (j * xIncreace < maxIncreace || j * yIncreace < maxIncreace); j++) { startPoint.y = currentPoint.y + j * yIncreace; if (startPoint.y > currentPoint.y + absHeight) { startPoint.x = Math.min((startPoint.y - currentPoint.y - absHeight) * Math.tan(lineAngle * RADIAN_UINT), currentPoint.x + absWidth); startPoint.y = currentPoint.y + absHeight; } else { startPoint.x = currentPoint.x; } endPoint.x = currentPoint.x + j * xIncreace; if (endPoint.x > currentPoint.x + absWidth) { endPoint.y = Math.min(currentPoint.y + (endPoint.x - currentPoint.x - absWidth)/Math.tan(lineAngle * RADIAN_UINT), currentPoint.y + absHeight); endPoint.x = currentPoint.x + absWidth; } else { endPoint.y = currentPoint.y; } g.moveTo(startPoint.x, startPoint.y); g.lineTo(endPoint.x, endPoint.y); } } else if(lineAngle > 90 && lineAngle < 180) { if(height > 0) { currentPoint.y = height; } xIncreace = lineGap / Math.sin((180 - lineAngle) * RADIAN_UINT); yIncreace = lineGap / Math.cos((180 - lineAngle) * RADIAN_UINT); maxIncreace = Math.max(absHeight + absWidth * Math.tan((180 - lineAngle) * RADIAN_UINT) ,absWidth + absHeight / Math.tan((180 - lineAngle) * RADIAN_UINT)); for (var k:int = 1; (k * xIncreace < maxIncreace || k * yIncreace < maxIncreace); k++) { startPoint.y = currentPoint.y - k * yIncreace; if (startPoint.y < currentPoint.y - absHeight) { startPoint.x = Math.min(Math.abs(currentPoint.y - absHeight - startPoint.y) / Math.tan((180 - lineAngle) * RADIAN_UINT), currentPoint.x + absWidth); startPoint.y = currentPoint.y - absHeight; } else { startPoint.x = currentPoint.x; } endPoint.x = currentPoint.x + k * xIncreace; if (endPoint.x > currentPoint.x + absWidth) { endPoint.y = Math.max(currentPoint.y - ((endPoint.x - currentPoint.x - absWidth) * Math.tan((180 - lineAngle) * RADIAN_UINT)), currentPoint.y - absHeight); endPoint.x = currentPoint.x + absWidth; } else { endPoint.y = currentPoint.y; } g.moveTo(startPoint.x, startPoint.y); g.lineTo(endPoint.x, endPoint.y); } } } } } Example: 创建一个App,使ColumnSeries 的ItemRender 为linesRender ColumnChartApp.mxml <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*"> <mx:Script> import mx.collections.ArrayCollection; [Bindable] public var dataCollection:ArrayCollection = new ArrayCollection([ {Month: "Jan", Income: 2000, AverageIncome:1620 }, {Month: "Feb", Income: 600, AverageIncome:1620}, {Month: "Mar", Income: 1500,AverageIncome:1620}, {Month: "Apr", Income: 2500, AverageIncome:1620}, {Month: "May", Income: 1500, AverageIncome:1620}]); </mx:Script> <mx:Panel> <mx:ColumnChart id="myChart" dataProvider="{dataCollection}" showDataTips="true" type="overlaid"> <mx:horizontalAxis> <mx:CategoryAxis dataProvider="{dataCollection}" categoryField="Month"/> </mx:horizontalAxis> <mx:series> <mx:ColumnSeries xField="Month" yField="AverageIncome" displayName="Average" > <mx:itemRenderer> <mx:Component> <local:LinesRenderer lineAngle="45" lineGap="5" lineColor="0xffff00"/> </mx:Component> </mx:itemRenderer> </mx:ColumnSeries> </mx:series> </mx:ColumnChart> </mx:Panel> </mx:Application> 注:代码可以独立运行,LinesRenderer.as 中的drawShadeLine()算法不是很理想,有待于改进。
draw lines on ColumnChart的更多相关文章
- Java基础之在窗口中绘图——绘制直线和矩形(Sketcher 2 drawing lines and rectangles)
控制台程序. import javax.swing.JComponent; import java.util.*; import java.awt.*; import java.awt.geom.*; ...
- Compare, sort, and delete duplicate lines in Notepad ++
Compare, sort, and delete duplicate lines in Notepad ++ Organize Lines: Since version 6.5.2 the app ...
- 使用AxisHelper帮助理解View and Data API中的坐标系统
大家使用View and Data API做三维模型开发,必然首先要理解View and Data API的坐标系统,即XYZ三个轴向分别是怎么定义的.Three.js里面提供了一个AxisHelpe ...
- OpenCV特征点检测------ORB特征
OpenCV特征点检测------ORB特征 ORB是是ORiented Brief的简称.ORB的描述在下面文章中: Ethan Rublee and Vincent Rabaud and Kurt ...
- TAQSkinScrollBar 类美化滚动条再讨论
再说:TAQSkinScrollBar 类美化滚动条,http://www.138soft.com/?p=156 里面有人提到不可以滚动 滚动的改善方法: unit AQSkinScrollBar; ...
- Using Headless Mode in the Java SE Platform--转
原文地址: By Artem Ananiev and Alla Redko, June 2006 Articles Index This article explains how to use ...
- HTML5资料
1 Canvas教程 <canvas>是一个新的用于通过脚本(通常是JavaScript)绘图的HTML元素.例如,他可以用于绘图.制作图片的组合或者简单的动画(当然并不那么简单).It ...
- PCA and kmeans MATLAB实现
MATLAB基础知识 l Imread: 读取图片信息: l axis:轴缩放:axis([xmin xmax ymin ymax zmin zmax cmin cmax]) 设置 x.y 和 ...
- jquery jqPlot API 中文使用教程
jqPlot是一个灰常强大的图表工具,曲线,柱状,饼图,应该有尽有,更要命的是,调用方便~~ 官网:http://www.jqplot.com/ 这里贡献上中文教程,基本上所有的api都很齐全,供有需 ...
随机推荐
- 使用 phpMailer 基于(SMTP) 发送邮件
PHPMailer是一个用于发送电子邮件的PHP函数包.它提供的功能包括:在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址.支持多种邮件编码包括:8bit,base64,binary和quote ...
- 让Scrapy的Spider更通用
1,引言 <Scrapy的架构初探>一文所讲的Spider是整个架构中最定制化的一个部件,Spider负责把网页内容提取出来,而不同数据采集目标的内容结构不一样,几乎需要为每一类网页都做定 ...
- Max Num---hdu2071
Max Num Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- PHP数组排序函数array_multisort()函数详解
这个函数因为用到了,并且在网上找了半天终于找到了一个写的通俗易懂的文章,在这里分享给大家. 原文链接:http://blog.163.com/lgh_2002/blog/static/44017526 ...
- 【stm32】实现STM32的串口数据发送和printf函数重定向
在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进 ...
- linux之SQL语句简明教程---ALTER TABLE
在表格被建立在资料库中后,我们常常会发现,这个表格的结构需要有所改变.常见的改变如下: 加一个栏位 删去一个栏位 改变栏位名称 改变栏位的资料种类 以上列出的改变并不是所有可能的改变.ALTER TA ...
- poj 1603 Risk_spfa向前星
poj终于到100题,贴个代码纪念一下,hdu 到400题再贴 题意:有20个城市,接下来有19行告诉你,i城市与n个城市相连,图是双向的,然后叫你求x到y的最小经过几个城市 #include < ...
- 为下拉式菜单(DropDownList)添加第一个选项
很多方法可以为为下拉式菜单(DropDownList)添加第一个选项,下面是Insus.NET小结了几个方法,仅供参考: Html code: <body> <form id= ...
- ASP.Net MVC中数据库数据导出Excel,供HTTP下载
本文来自:http://www.cnblogs.com/hipo/archive/2012/03/13/2394019.html 一.关于下载 一般对下载权限有没有限制,或安全性要求不高的情况下,基于 ...
- SVN连接不上
某次我们部门换了场地.SVNserver就连接不上了,后来公司数据中心处理好后,还是连接不上,原来还需刷新自己电脑的DNS. 如需转载,请注明出处http://blog.csdn.net/combat ...