这是例子
点击浏览该文件这是原文件
点击浏览该文件强烈要求版主把".AS"文件格式添加为可上传的文件类型
这是组件的代码大家把他考贝到Flash2004保存为pie.as并把他放到和那个原文件同一目录下就可以了
class pie extends MovieClip {
/*********************************************************
圆形分格统计图表 组件
版本:1.0
核芯代码来自Super-Tomato
我将它改写成AS2.0的组件 并添加了功能 这样方便大家使用
1.只要在组件属性面板中填写数据就可以自动生成圆饼图
2.可以动态的修改组件的m_data属性并调用DrawPIE();来动态更新圆饼图
3.修正了原代码的设置半径的BUG(至少在我这发现直接修改radius的值没有效果)
4.可以指定颜色,如果没有颜色值则随机生成
计划在下个版本中加入以下功能
1.相应事件
2.添加标签
3.可直接支持XML
4.其他想到在说阿 各位也可以 提点意见
koaqiu 2004-5-24于 E++工作室
**********************************************************/
private var angleA:Array = new Array();
private var angleB:Array = new Array();
private var radius:Number =100;
private var MC:MovieClip;
var m_data:Array;
var m_color:Array;
var m_radius:Number;
private function MakeAngle(md:Array) {
var l:Number;
var i:Number;
var 和:Number = 0;
var md_agn:Array = new Array();
angleA=new Array();
angleB=new Array();
for (i=0; i<md.length; i++) {
和 += md[i];
}
for (i=0; i<md.length; i++) {
md_agn.push(360*md[i]/和);
}
for (i=1; i<md_agn.length; i++) {
md_agn[i] = md_agn[i]+md_agn[i-1];
}
angleA[0] = 0;
for (i=1; i<md_agn.length; i++) {
angleA[i] = md_agn[i-1];
}
for (i=0; i<md_agn.length; i++) {
angleB[i] = md_agn[i];
}
}
function pie() {
MC=this;
DrawPIE();
}
function DrawPIE() {
radius=this.m_radius;
MakeAngle(this.m_data);
for (var i = 0; i<angleA.length; i++) {
MC.attachMovie("pie_mc", "pie"+i, i);
MC["pie"+i]._width =radius*200/100 ;
MC["pie"+i]._height = radius*126.6/100;
MC["pie"+i]._x = MC["pie"+i]._width/2;
MC["pie"+i]._y = MC["pie"+i]._height/2;
MC.createEmptyMovieClip("mask"+i, i+angleA.length);
MC["mask"+i]._x = MC["pie"+i]._x;
MC["mask"+i]._y = MC["pie"+i]._y-15;
Draw(angleA[i], angleB[i], i);
MC["pie"+i].setMask(MC["mask"+i]);
if(isNaN(this.m_color[i])){
setHue(Math.floor(Math.random()*0xFFFFFF), i);
}else{
setHue(this.m_color[i], i);
}
}
}
private function Point(Angle:Number) {
var pt:Object = new Object();
pt.x = radius*Math.cos((Math.PI/180)*Angle);
pt.y = (0.5)*radius*Math.sin((Math.PI/180)*Angle);
return pt;
}
private function Draw(angleA:Number, angleB:Number, depth:Number) {
var drawer:MovieClip = MC["mask"+depth].createEmptyMovieClip("drawer", 0);
drawer.beginFill(0xFFFFFF, 30);
var pt1:Object = Point(angleA);
drawer.lineTo(pt1.x, pt1.y);
if (pt1.y<=0) {
drawer.lineTo(2*pt1.x, 2*pt1.y);
} else {
drawer.lineTo(pt1.x, pt1.y+50);
}
var tempAngle:Number = angleA+10;
while (tempAngle<angleB) {
var tempPt:Object = Point(tempAngle);
drawer.lineTo(2*tempPt.x, 2*tempPt.y);
tempAngle += 10;
}
var pt2:Object = Point(angleB);
if (pt2.y<=0) {
drawer.lineTo(2*pt2.x, 2*pt2.y);
} else {
drawer.lineTo(pt2.x, pt2.y+50);
}
drawer.lineTo(pt2.x, pt2.y);
drawer.endFill();
}
private function setHue(rgb:Number, depth:Number) {
var c:Color = new Color(MC["pie"+depth]);
var cv:Number = rgb;
var r:Number = (cv >> 16)/2;
var g:Number = ((cv >> 8) & (0xFF))/2;
var b:Number = (cv & 0xFF)/2;
c.setTransform({ra:r, ga:g, ba:b, rb:0, gb:0, bb:0, aa:100, ab:0});
}
}