除了copy 像素的办法,还有一种是beginfillBitmap的做法来填充我们想要的数据,现在提供另外一种方法做一个简单实验。
第一种方式是继承bitmap ,第二种方式是先把位图裁剪后再拼合,代码方面有一些区别,实验的功能基本上可以达到想要的效果,至于性能那个好还要多做测试。
bitmap copy像素效率比较高,相对而言多少会增大一点内存,而使用shape 结合tweenlite 来使用,内存增加速度也有一点,不知道是不是错觉。
在这个方面也可以尝试去做更加试验,最近比较忙碌,想写博客做实验时间都变得少了。
好吧,有兴趣可以玩玩。
测试的代码,其中nums 为素材
package { import flash.display.Sprite; import com.greensock.TweenLite; import com.greensock.plugins.TweenPlugin; import com.greensock.plugins.EndArrayPlugin; import flash.events.MouseEvent; import flash.events.Event; public class Main extends Sprite { private var rollText:RollTextField; public function Main() { TweenPlugin.activate([EndArrayPlugin]); rollText=new RollTextField(); addChild(rollText); rollText.x=200; rollText.y=200; rollText.init(new nums(0,0),10); stage.addEventListener(MouseEvent.CLICK,onClick); addEventListener(Event.ENTER_FRAME,onRender); } private function onRender(event:Event):void { rollText.text=Math.random()*5000; //removeEventListener(Event.ENTER_FRAME,onRender); } private function onClick(event:MouseEvent):void { rollText.rollText=Math.random()*5000; } } }
package { import com.greensock.TweenLite; import com.greensock.plugins.*; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Shape; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; import flash.utils.Dictionary; import flash.display.Sprite; public class RollTextField extends Shape { private var source:BitmapData; private var w:Number; private var h:Number; private var rect:Rectangle; private var pt:Point; private var curValue:int = 0; private var offX:int = 0; private var bitmapData:Dictionary; private var matrix:Matrix; public var filterArr:Array = ["+","-"]; public var endFun:Function; public function ArtTextField() { } /** * @param source 一个数字的资源(0123456789) * @param len 裁剪的长度,默认为资源数字的长度 * @param offX 图片数字的偏移,有时候资源是带符号 +0123456789 或者-0123456789 ,如果不需要偏移则默认为0 */ public function init(source:BitmapData,len:int,offX:int=0):void { this.source = source; this.offX = offX; w = source.width / len; h = source.height; bitmapData=new Dictionary(); if (! rect) { rect = new Rectangle(0,0,w,h); } if (! pt) { pt=new Point(); } if (! matrix) { matrix=new Matrix(); } for (var i:int=0; i<len; i++) { var bit:BitmapData = new BitmapData(w,h,true,0x00ffffff); rect.x = i * w; rect.width = w; rect.height = h; bit.copyPixels(source,rect,pt); bitmapData[i] = bit; } } public function set text(value:int):void { if (! source || value == curValue) { return; } this.curValue = value; this.graphics.clear(); var myNewStr:String = String(value); var len:int = myNewStr.length; for (var i:int=0; i<len; i++) { var num:int = 0; if (filterArr.indexOf(myNewStr.charAt(i)) == -1) { //过滤数组 num = int(myNewStr.charAt(i)) + offX; } if (bitmapData[num]) { matrix.tx = i * w; this.graphics.beginBitmapFill(bitmapData[num],matrix,false); this.graphics.drawRect(i*w,0,w,h); this.graphics.endFill(); } } } public function dispose():void { for each (var bit:BitmapData in bitmapData) { bit.dispose(); bit = null; } } public function set rollText(value:int):void { if (! source || value == curValue) { return; } var myArray:Array = [curValue]; this.curValue = value; TweenLite.to(myArray, 1, {endArray:[value],onUpdate:onUpdateView,onComplete:onComplete}); function onUpdateView():void { text = myArray[0]; } function onComplete():void { if (endFun!=null) { endFun.apply(null,null); } } } } }