[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(); } } }
相关文章推荐
- 类中重载和重写的区别
- 字符串常量演示Demo
- Codeforces Round #260 (Div. 2) D. A Lot of Games
- 【英语】20150713 生词
- 字符串常量演示Demo
- OAF_开发系列17_实现OAF数组应用Vector / Hashmap / Hashtable / Arraylist(案例)
- angularJS socket
- [ActionScript 3.0] 绘制扇形方法
- HTTP/2笔记之错误处理和安全
- GRE写作必备句型
- NSData 与NSString Byte UIImage之间的转换
- 《iOS总结》APP上传步骤(详细版)
- 一句代码搞定,所有页面点击空白处隐藏键盘
- hibernate实体类型映射文件
- 第一份工作
- HTTP/2笔记之消息交换
- poj 3614 抹防晒霜的牛(贪心 + 优先队列)
- hdu 4630 No Pain No Game(线段树+离线操作)
- HTTP/2笔记之帧
- 5套博客园皮肤模板