AS3将文字生成位图功能实现
最近做一个动画,需要将动态文本旋转以配合设计效果,但众所周知在Flash里有一个Bug,就是动态文本旋转之后就不可见了。
为了解决这一问题,问了百度,解决办法基本上是使用图片替换。网上流传的一些功能不够强大便捷,于是动手写了个静态类。
效果展示:
类原码:
package com.shirne.extend { import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFieldAutoSize; import flash.text.StyleSheet; import flash.display.Sprite; import flash.display.BitmapData; import flash.display.Bitmap; import flash.geom.Rectangle; import flash.geom.ColorTransform; public class ExBitmap { public function ExBitmap() { } public static function getTextFieldBitmap( t:TextField, trans:Boolean = true, smoothing:Boolean = true):Bitmap { var s:Sprite = new Sprite(); s.addChild(t); var bitmapdata:BitmapData = new BitmapData(s.width,s.height); if(trans){ bitmapdata.colorTransform(new Rectangle(0,0,s.width,s.height), new ColorTransform(0,0,0,0)); } bitmapdata.draw(s,null,null,null,null,true); var bmp:Bitmap = new Bitmap(bitmapdata); bmp.smoothing = smoothing; return bmp; } /** * 将文本转换为图像 * 文本为html文本,可以设定样式 * 默认背景透明,平滑处理 */ public static function getHtmlTextBitmap(txt:String, style:StyleSheet=null, trans:Boolean = true, smoothing:Boolean = true):Bitmap { var t:TextField = new TextField(); t.autoSize = TextFieldAutoSize.LEFT; if(style)t.styleSheet = style; t.htmlText = txt; return getTextFieldBitmap(t, trans, smoothing); } /** * 将文本转换为图像 * 文本为纯文本,可以设定样式 * 默认背景透明,平滑处理 */ public static function getTextBitmap(txt:String, tf:TextFormat = null, trans:Boolean = true, smoothing:Boolean = true):Bitmap { var t:TextField = new TextField(); t.autoSize = TextFieldAutoSize.LEFT; t.text = txt; if(tf)t.setTextFormat(tf); return getTextFieldBitmap(t, trans, smoothing); } /** * 将文本转换为图像 * 文本为纯文本,可以设定逐字样式 * 默认背景透明,平滑处理 */ public static function getTextBitmapEx(txt:String, textFormats:Array = null, ratios:Array=null, trans:Boolean = true, smoothing:Boolean = true):Bitmap { var t:TextField = new TextField(); t.autoSize = TextFieldAutoSize.LEFT; t.text = txt; if(textFormats){ var i:int=0, l:int = textFormats.length, rl:int, j:int = 0; var tLen:int = txt.length; if(!ratios){ //没有给定样式位置,则逐字设定 for(i = 0; i < l - 1; i++){ trace(i) if(textFormats[i])t.setTextFormat(textFormats[i],i,i+1); } //最后的样式应用于所有字体 if(textFormats[i])t.setTextFormat(textFormats[i],i, tLen); }else{ //给定样式位置,则依照给定位置设置 rl = ratios.length; for(i = 0; i<Math.min(rl-1, l); i++){ if(textFormats[i])t.setTextFormat(textFormats[i],ratios[i],ratios[i+1]); } if( textFormats[i])t.setTextFormat(textFormats[i],ratios[i], tLen); } } return getTextFieldBitmap(t, trans, smoothing); } } }
这里面几个静态函数不仅实现了将普通文本转换为位图,还实现了可设定样式的文本位置转换和设定了样式的html文本转换。
以下是使用的示例代码(用到了greensock的一个动画库)
import com.shirne.extend.ExBitmap; import flash.text.TextField; import flash.text.StyleSheet; import flash.text.TextFormat; import flash.display.Bitmap; import flash.display.Sprite; import flash.display.DisplayObject; import flash.events.MouseEvent; import fl.controls.Button; import com.greensock.TweenNano; import flash.text.TextFieldAutoSize; var step:int = 50; var box:Sprite=new Sprite(); box.x = 30; box.y = 30; addChild(box); var txt:TextField = new TextField(); txt.autoSize = TextFieldAutoSize.LEFT; txt.text= "原始动态文本组件,旋转就会消失" box.addChild(txt); addControl(txt); var bmp1:Bitmap = ExBitmap.getTextBitmap('第一种方法,不带任何样式直接生成'); bmp1.y = step; box.addChild(bmp1); addControl(bmp1); var ss:StyleSheet=new StyleSheet(); ss.setStyle('.normal',{color:'#aa6600',fontSize:'14px',fontWight:'bold'}); var bmp2:Bitmap = ExBitmap.getHtmlTextBitmap('<span class="normal">第二种方法,生成带样式的html文本</span>',ss); bmp2.y = step * 2; box.addChild(bmp2); addControl(bmp2); var tf:TextFormat = new TextFormat(); tf.color = 0x0066aa; tf.size = 16; tf.bold = true; var bmp3:Bitmap = ExBitmap.getTextBitmap('第三种方法,生成带样式的普通文本',tf); bmp3.y = step * 3; box.addChild(bmp3); addControl(bmp3); var tf1:TextFormat = new TextFormat(); tf1.color = 0x0066aa; tf1.size = 16; tf1.bold = true; var tf2:TextFormat = new TextFormat(); tf2.color = 0xaa66aa; tf2.size = 22; tf2.bold = true; var tf3:TextFormat = new TextFormat(); tf3.color = 0xff00aa; tf3.size = 14; tf3.bold = true; var bmp4:Bitmap = ExBitmap.getTextBitmapEx('第四种方法,生成带多种样式的普通文本',[tf1,tf2,tf3],[0,3,5]); bmp4.y = step * 4; box.addChild(bmp4); addControl(bmp4); function addControl(target:DisplayObject):void{ var btn:Button = new Button(); btn.label = '转一下看看'; btn.y = target.y; btn.x = target.x + target.width + 50; btn.addEventListener(MouseEvent.CLICK,function(){ TweenNano.to(target,1,{rotation:180,onComplete:function(){ TweenNano.to(target,.5,{rotation:0}); }}); }); box.addChild(btn); }