Flash动态生成扇形

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);
            } 
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值