您的位置:首页 > 其它

[ActionScript 3.0] 动态绘制扇形实例(拖拽绘制)

2015-07-13 13:09 477 查看
package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.MouseEvent;

/**
* @author Frost.Yen
* @E-mail 871979853@qq.com
* @create 2015-7-13 上午11:14:16
*
*/
[SWF(width="800",height="600")]
public class DrawSectorTest extends Sprite
{
private var _sector:Sprite;
private var _dragSp:Sprite;
private var _radian:Number;//弧度
private const _radius:uint = 100;//半径
private const _angle:Number = 60;//初始角度
public function DrawSectorTest()
{
_sector = new Sprite();
_dragSp = new Sprite();
_sector.x = _dragSp.x = stage.stageWidth*0.5;
_sector.y = _dragSp.y = stage.stageHeight*0.5;
this.addChild(_sector);
this.addChild(_dragSp);

_dragSp.graphics.beginFill(0,.2);
_dragSp.graphics.drawRect(0,-5,_radius,10);
_dragSp.graphics.endFill();

drawSector(_sector,0,0,_radius,_angle,0);
_dragSp.rotation = _angle;
_dragSp.addEventListener(MouseEvent.MOUSE_DOWN,onDragDown);
}
private function onDragDown(e:MouseEvent):void
{
stage.addEventListener(MouseEvent.MOUSE_MOVE,onDragMove);
stage.addEventListener(MouseEvent.MOUSE_UP,onDragOut);
}
private function onDragMove(e:MouseEvent):void
{
_dragSp.rotation = Math.atan2(_dragSp.parent.mouseY - _dragSp.y,_dragSp.parent.mouseX - _dragSp.x) * 180 / Math.PI ;
_radian = (_dragSp.rotation) * Math.PI / 180;
/**这是关键,因为rotation的区间是[0,180][0,-180],如果直接用_dragSp.rotation会导致拖拽绘制扇形错误*/
if (_dragSp.rotation > 180){
_radian = _radian + Math.PI;
}
if (_radian < 0){
_radian = _radian + 2 * Math.PI;
}
drawSector(_sector,0,0,_radius,_radian*180/Math.PI,0);
}
private function onDragOut(e:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE,onDragMove);
stage.removeEventListener(MouseEvent.MOUSE_UP,onDragOut);

}
/**
* 绘制扇形
* @param    mc 承载扇形的对象
* @param    x 圆心角x
* @param    y 圆心角y
* @param    r 半径
* @param    angle 绘制角度
* @param    startAngle 起始角度
* @param    color 填充颜色
* @param    hasFrame 是否填充边框
*/
private function drawSector(sp:Sprite,x:Number=0,y:Number=0,r:Number=100,angle:Number=60,startAngle:Number=0,color:Number=0xff0000,hasFrame:Boolean=true):void {
sp.graphics.clear();
if(hasFrame) {
sp.graphics.lineStyle(0,0xffff00);
}
sp.graphics.beginFill(color,1);
sp.graphics.moveTo(x,y);
angle=(Math.abs(angle)>360)?360:angle;
var n:Number=Math.ceil(Math.abs(angle)/45);
var angleA:Number=angle/n;
angleA=angleA*Math.PI/180;
startAngle=startAngle*Math.PI/180;
sp.graphics.lineTo(x+r*Math.cos(startAngle),y+r*Math.sin(startAngle));
for (var i:int=1; i<=n; i++) {
startAngle+=angleA;
var angleMid:Number=startAngle-angleA/2;
var bx:Number=x+r/Math.cos(angleA/2)*Math.cos(angleMid);
var by:Number=y+r/Math.cos(angleA/2)*Math.sin(angleMid);
var cx:Number=x+r*Math.cos(startAngle);
var cy:Number=y+r*Math.sin(startAngle);
sp.graphics.curveTo(bx,by,cx,cy);
}
if (angle!=360) {
sp.graphics.lineTo(x,y);
}
sp.graphics.endFill();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: