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();
}
}
}
这个类使用上面的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);
}
}
}
}