ShapeNumber

package chuanqi2.utils
{
    import com.junyougame.core.SharedBMD;
    import com.minimvc.core.Singleton;
    
    import flash.display.BitmapData;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.utils.Dictionary;
    /**
     * 
     * @author gushuai
     * 
     */    
    public class ShapeNumber extends Sprite
    {
        public static const WIDTH_CHANGE:String = "WIDTH_CHANGE";
        private var _definiton:String;
        private var _dividedType:String;
        private var _hgap:int;
        private var _numberWidth:int;
        private var _numberHeight:int;
        private var _numString:String;
        private var _libBitmapData:BitmapData;
        private var _dividedNumDic:Dictionary;
        private var _numStringChanged:Boolean = false;
        private var _hgapChanged:Boolean = false;
        
        public var centerFlag:Boolean = false;
        
        private var _oldLen:int;
        
        /**
         * @param _definition 引用的库路径
         * @param _dividedType 切割方式,值为美术给的美术字
         * @param _hgap 后一个数字头与前一个数字尾之间的距离*/
        public function ShapeNumber(_definition:String,_hgap:Number=0,_dividedType:String="1234567890")
        {
            super();
            this._dividedType = _dividedType;
            definition = _definition;
            hgap = _hgap;
        }
        
        /**库定义*/
        public function set definition(value:String):void
        {
            if(value != _definiton)
            {
                _definiton = value;
                if(!SharedBMD.libBMD[value])
                {
                    var cls:Class = Singleton.getClass(value);
                    var bmd:BitmapData = new cls();
                    SharedBMD.libBMD[value] = bmd;
                }
                _libBitmapData = SharedBMD.libBMD[value];
                divided();
            }
        }
        
        /**设置字符间距*/
        public function set hgap(value:Number):void
        {
            if(_hgap != value)
            {
                _hgap = value;
                _hgapChanged = true;
                invalidateView();
            }
        }
        
        /**切割*/
        private function divided():void
        {
            var _piece:int = _dividedType.length;
            _numberWidth = _libBitmapData.width/_piece;
            _numberHeight = _libBitmapData.height;
            _dividedNumDic = new Dictionary();
            var rect:Rectangle;
            for(var i:int = 0;i<_piece;i++)
            {
                if(!SharedBMD.libBMD[_definiton+_dividedType.charAt(i)])
                {
                    rect = new Rectangle(i*_numberWidth,0,_numberWidth,_numberHeight);
                    var bmp:BitmapData = new BitmapData(_numberWidth,_numberHeight);
                    bmp.copyPixels(_libBitmapData,rect,new Point(0,0));
                    SharedBMD.libBMD[_definiton+_dividedType.charAt(i)] = bmp;
                }
                _dividedNumDic[_dividedType.charAt(i)] = SharedBMD.libBMD[_definiton+_dividedType.charAt(i)];
            }
            rect = null;
        }
        
        /**值**/
        public function set numString(value:String):void
        {
            if(_numString != value)
            {
                _numString = value;
                _numStringChanged = true;
                invalidateView();
            }
            if(_oldLen != value.length)
            {
                dispatchEvent(new Event(WIDTH_CHANGE));
            }
            _oldLen = value.length;
        }
        
        private function invalidateView():void
        {
            addEventListener(Event.ENTER_FRAME,onRender);
        }
        
        private function onRender(e:Event):void
        {
            removeEventListener(Event.ENTER_FRAME,onRender);
            if(_numStringChanged||_hgapChanged)
            {
                if(_numStringChanged)
                {
                    _numStringChanged = false;
                }
                if(_hgapChanged)
                {
                    _hgapChanged = false;
                }
                draw();
            }
        }
        
        private function draw():void
        {
            if(_numString)
            {
                graphics.clear();
                var len:int = _numString.length;
                var i:int = 0;
                for(i;i<len;i++)
                {
                    graphics.beginBitmapFill(_dividedNumDic[_numString.charAt(i)],new Matrix(1,0,0,1,i*(_numberWidth+_hgap),0));
                    graphics.drawRect(i*(_numberWidth+_hgap),0,_numberWidth,_numberHeight);
                }
                graphics.endFill();
                if(centerFlag)
                {
                    if(parent)
                    {
                        this.x = parent.width - this.width >>1;
                    }
                }
            }
        }
        
        /**获取单个图片**/
        public function getshape(type:String):Shape
        {
            if(_dividedNumDic[type])
            {
                var shape:Shape = new Shape();
                shape.graphics.beginBitmapFill(_dividedNumDic[type]);
                shape.graphics.drawRect(0,0,_numberWidth,_numberHeight);
                shape.graphics.endFill();
                return shape;
            }
            return null;
        }
        
        public function dispose():void
        {
            graphics.clear();
            _dividedNumDic = null;
        }
        
        override public function get width():Number
        {
            return _numberWidth*_numString.length + (_numString.length - 1)*_hgap;
        }
//        /**
//         *一个字的渲染长度 
//         * @return 
//         */        
//        public function get wordWidth():int
//        {
//            return _numberWidth + _hgap;
//        }
        
        override public function get height():Number
        {
            return _numberHeight;
        }
    }
}

 

转载于:https://www.cnblogs.com/jiangjieqim/p/5694259.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值