除了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);
}
}
}
}
}