原文 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都很齐全,供有需 ...
随机推荐
-
Hive读取外表数据时跳过文件行首和行尾
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 有时候用hive读取外表数据时,比如csv这种类型的,需要跳过行首或者行尾一些和数据无关的或者自 ...
-
GitHub简单教程
Hello World程序是计算机编程中由来已久的惯例,这是一个当你在学习新事物的时候开始的一个简单的小练习.让我们开始GitHub的"Hello World". 你将学会: - ...
-
Java主要有那几种文件类型,各自作用
java提供了两类数据类型:基本类型,引用类型. 1.基本类型包括:boolean ,byte,char,int,short,float,long,double,值得注意的是:在原始数据类型中,除了b ...
-
Sharepoint2010之父子表实现
在Sharepoint的实际运用中会经常使用到父子表来建立2个表之间的关系.通常父表为表头,存储公共的数据项目,子表存储细分的项目. 例如通过下面2个表实现图书借阅功能,表1为图书的基础信息,表2为图 ...
-
简单的JQuery分页代码
1. [代码][JavaScript]代码 001 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...
-
20169210《Linux内核原理与分析》第十二周作业
Return-to-libc 攻击实验 缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中 shellcode.为了阻止这种类型的攻击,一些 ...
-
OC语法8——@class关键字
@class关键字: 在当前类中若要引用其他类的对象作成员变量(Book *book),我们以前采用的方式是 #import "Book.h" 但 #import "B ...
-
Unity Shader Graph 小功能实现(一)边缘发光
在Unity 2018.2 版本正式启用了高清渲染管线,shader可视化编程. 现在我们就尝尝鲜,来实现了个物体边缘发光的shader效果. 准备 点击Windos->Package Mang ...
-
java jdbc ResultSet结果通过java反射赋值给java对象
在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. ...
-
[X][xrandr][archlinux] 手动调整显示器分辨率
有一些时候,电脑并不能正确的识别出显示器的最大分辨率,这有可能是软件的原因,硬件的原因,显示器的原因,VGA线的原因等其他原因. 我遇到的情况,是开机时候连着VGA的话,就可以正确识别.如果使用中间进 ...