Flash并没有提供可以直接生成扇形的API。使用curveTo画的也只是贝塞尔曲线,不是圆弧线,
所以只能自己手动用微积分的原理生成了。
////////////////////////////////////////////////////////////////////////////////
//
// GiantJadder@gmail.com
// This class is designed to generate dynamic sectors.
//
////////////////////////////////////////////////////////////////////////////////
package {
import flash.display.Sprite;
import flash.display.Graphics;
public class Sector extends Sprite {
private var innerRadius:Number;
private var outterRadius:Number;
private var angle:Number;
private var startXAngle:Number;
private var quality:int;
private var color:uint;
private var sectorAlpha:Number;
private var n:int;
private var smallAngle:Number;
private var g:Graphics;
public function reDraw(
_innerRadius:Number,
_outterRadius:Number,
_angle:Number,
_startXAngle:Number,
_color:uint,
_alpha:Number,
_quality:int // from 0 ~ 4;
):void{
innerRadius = _innerRadius;
outterRadius = _outterRadius;
angle = _angle;
startXAngle = _startXAngle;
quality = _quality;
color = _color;
sectorAlpha = _alpha;
g = graphics;
g.clear();
n = 20*(quality+1);
smallAngle = angle/n;
var i:int = 0;
g.beginFill(color,sectorAlpha);
g.moveTo( outterRadius*Math.cos( startXAngle), -outterRadius*Math.sin(startXAngle) );
for(i=1;i<=n;i++){
g.lineTo(
outterRadius*Math.cos( startXAngle+i*smallAngle),
-outterRadius*Math.sin( startXAngle+i*smallAngle)
);
}
g.lineTo( innerRadius*Math.cos( startXAngle+angle), -innerRadius*Math.sin(startXAngle+angle) );
for(i=1;i<=n;i++){
g.lineTo(
innerRadius*Math.cos( startXAngle+angle-i*smallAngle),
-innerRadius*Math.sin( startXAngle+angle-i*smallAngle)
);
}
g.endFill();
}
}
}
//
// GiantJadder@gmail.com
// This class is designed to generate dynamic sectors.
//
////////////////////////////////////////////////////////////////////////////////
package {
import flash.display.Sprite;
import flash.display.Graphics;
public class Sector extends Sprite {
private var innerRadius:Number;
private var outterRadius:Number;
private var angle:Number;
private var startXAngle:Number;
private var quality:int;
private var color:uint;
private var sectorAlpha:Number;
private var n:int;
private var smallAngle:Number;
private var g:Graphics;
public function reDraw(
_innerRadius:Number,
_outterRadius:Number,
_angle:Number,
_startXAngle:Number,
_color:uint,
_alpha:Number,
_quality:int // from 0 ~ 4;
):void{
innerRadius = _innerRadius;
outterRadius = _outterRadius;
angle = _angle;
startXAngle = _startXAngle;
quality = _quality;
color = _color;
sectorAlpha = _alpha;
g = graphics;
g.clear();
n = 20*(quality+1);
smallAngle = angle/n;
var i:int = 0;
g.beginFill(color,sectorAlpha);
g.moveTo( outterRadius*Math.cos( startXAngle), -outterRadius*Math.sin(startXAngle) );
for(i=1;i<=n;i++){
g.lineTo(
outterRadius*Math.cos( startXAngle+i*smallAngle),
-outterRadius*Math.sin( startXAngle+i*smallAngle)
);
}
g.lineTo( innerRadius*Math.cos( startXAngle+angle), -innerRadius*Math.sin(startXAngle+angle) );
for(i=1;i<=n;i++){
g.lineTo(
innerRadius*Math.cos( startXAngle+angle-i*smallAngle),
-innerRadius*Math.sin( startXAngle+angle-i*smallAngle)
);
}
g.endFill();
}
}
}
这个类使用上面的Sector来生成一个双层圆环。
package {
import flash.display.MovieClip;
import flash.events.Event;
[SWF(backgroundColor=0xfffff0,width=700,height=700,frameRate=30)]
public class SectorDemo extends MovieClip {
private var innerR:Number = 100;
private var mediateR:Number = 200;
private var outterR:Number = 300;
private var colors:Array = [ 0xffffff*Math.random(),
0xffffff*Math.random(),
0xffffff*Math.random(),
0xffffff*Math.random(),
0xffffff*Math.random()
];
private var innerSectors:Array;
private var outterSectors:Array;
public function SectorDemo() {
addEventListener(Event.ENTER_FRAME,animating);
innerSectors = new Array();
outterSectors = new Array();
var i:int = 0;
for(i=0;i<4;i++){
var innerSector:Sector = new Sector();
addChild(innerSector);
innerSector.x = 350;
innerSector.y = 350;
innerSectors[i] = innerSector;
}
for(i=0;i<4;i++){
var outterSector:Sector = new Sector();
addChild(outterSector);
outterSector.x = 350;
outterSector.y = 350;
outterSectors[i] = outterSector;
}
}
private var angle:Number = 0;
private function animating(e:Event):void{
angle+= 0.01;
var i:int = 0;
for(i=0;i<4;i++){
innerSectors[i].reDraw( innerR,mediateR, Math.PI*0.5, angle+i*Math.PI*0.5,colors[i] ,1.0,4);
}
for(i=0;i<4;i++){
outterSectors[i].reDraw( mediateR,outterR,Math.PI*0.5, -angle+i*Math.PI*0.5+Math.PI*0.25, colors[i] ,1.0,4);
}
}
}
}
import flash.display.MovieClip;
import flash.events.Event;
[SWF(backgroundColor=0xfffff0,width=700,height=700,frameRate=30)]
public class SectorDemo extends MovieClip {
private var innerR:Number = 100;
private var mediateR:Number = 200;
private var outterR:Number = 300;
private var colors:Array = [ 0xffffff*Math.random(),
0xffffff*Math.random(),
0xffffff*Math.random(),
0xffffff*Math.random(),
0xffffff*Math.random()
];
private var innerSectors:Array;
private var outterSectors:Array;
public function SectorDemo() {
addEventListener(Event.ENTER_FRAME,animating);
innerSectors = new Array();
outterSectors = new Array();
var i:int = 0;
for(i=0;i<4;i++){
var innerSector:Sector = new Sector();
addChild(innerSector);
innerSector.x = 350;
innerSector.y = 350;
innerSectors[i] = innerSector;
}
for(i=0;i<4;i++){
var outterSector:Sector = new Sector();
addChild(outterSector);
outterSector.x = 350;
outterSector.y = 350;
outterSectors[i] = outterSector;
}
}
private var angle:Number = 0;
private function animating(e:Event):void{
angle+= 0.01;
var i:int = 0;
for(i=0;i<4;i++){
innerSectors[i].reDraw( innerR,mediateR, Math.PI*0.5, angle+i*Math.PI*0.5,colors[i] ,1.0,4);
}
for(i=0;i<4;i++){
outterSectors[i].reDraw( mediateR,outterR,Math.PI*0.5, -angle+i*Math.PI*0.5+Math.PI*0.25, colors[i] ,1.0,4);
}
}
}
}