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都很齐全,供有需 ...
随机推荐
- 分析BGARefreshLayout-master
一.知识点,创建BaseActivity 建立方法的逻辑顺序 并将一些常用的方法填充到其中 ①.将initView().setListener().onClick().processLogic()方法 ...
- python 源代码分析之调试设置
首先在官方下载源代码,我下载的是最新版本3.4.3版本:https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz 解压后的目录如下(借用网上的目 ...
- codeforces 518C. Anya and Smartphone
C. Anya and Smartphone time limit per test 1 second memory limit per test 256 megabytes input standa ...
- CentOS下安装Nginx并添加nginx_upload_module
安装前,最好能保证依赖的系统软件已经升级. yum update CentOS上安装Nginx,如果只是简单安装,不附加其他第三方模块,一句话可以搞定: yum install nginx ...
- 微软源代码管理工具TFS2013安装与使用图文教程
微软源代码管理工具TFS2013安装与使用图文教程 这篇文章主要介绍了微软源代码管理工具TFS2013安装与使用图文教程,本文详细的给出了TFS2013的安装配置过程.使用教程,需要的朋友可以参考下 ...
- CRAHNs: Cognitive radio ad hoc networks
2009 Elsevier 综述了认知无线AD Hoc网络中的各个方面的研究进展及面临的挑战.包括传输层.网络层.链路层的协议设计. 根据CCC(common control channel)的实现思 ...
- 100个linux常用命令
1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部 2 ...
- poj 1083 Moving Tables_dp
题意:给你n个凳子,接着告诉你一个凳子从a房间到b房间,运输时间为10分钟,走廊很窄能通过一张凳子,当然不堵塞的话能同时扮凳子,问最小花费多少时间 因为数据很小就直接用数组统计了,a,b如果是奇数的话 ...
- 开源 java CMS - FreeCMS2.3 移动app生成首页数据
原文地址:http://javaz.cn/site/javaz/site_study/info/2015/28160.html 项目地址:http://www.freeteam.cn/ 生成首页数据 ...
- Java File类读取文件属性
package myjavademo;import java.io.*; publicclass MyJavaDemo { public static void main(String[] ...