Egret自定义位图文字

因为egret的位图文字是texturemerger做的,需要多张单图片导入tm,然后会导出生成两个文件,制作过程比较麻烦。

看了决战沙城的自定义位图文字后,现在也做了一个。支持使用整图和单张图片。

测试用整图

测试用单张图

具体代码

/**
 * 位图文字
 * @author ck 2019.11.10
 */
class BitmapFont extends eui.Component{
	/**位图缓存 */
	private static bmCaches:Array<egret.Bitmap> = [];
	/**纹理缓存 */
	private static textureCaches = {};
	/**显示的文字 */
	private _text:string;
	/**图片名 */
	private pngName:string;

	public constructor(pngName:string) {
		super();
		this.pngName = pngName;
	}

	/**
	 * 文字在一张图上
	 * @param pngName 图片名   pngName = font_test  (font_test.png)
	 * @param txt     文字名   "0123456789.+-"
	 */
	public static initByOne(pngName:string, txt:string){
		let textureCache = this.getTextureCache(pngName);
		if(textureCache.length > 0){
			console.log("位图字体缓存已存在:",pngName);
			return;
		}
		let src:egret.Bitmap = new egret.Bitmap();
		src.texture = RES.getRes(pngName + "_png");
		let len = txt.length;
		let fontWidth:number = src.width/len;
		let fontHeight:number=  src.height;
		let texture:egret.RenderTexture;
		let rect:egret.Rectangle = new egret.Rectangle();
		for(let i=0;i<len;i++){
			texture = new egret.RenderTexture();
			rect.x = i*fontWidth;
			rect.y = 0;
			rect.width = fontWidth;
			rect.height = fontHeight;
			texture.drawToTexture(src, rect);
			textureCache[txt.charAt(i)] = texture;
		}
	}

	/**
	 * 文字在不同的图片上
	 * @param pngName 图片名 pngName=font    多张图片源文件名(font0.png font1.png .... fontdot.png)
	 * @param txt     文字名 "0123456789.+-"
	 */
	public static initByMulti(pngName:string, txt:string){
		let textureCache = this.getTextureCache(pngName);
		if(textureCache.length > 0){
			console.log("位图字体缓存已存在:",pngName);
			return;
		}
		let len = txt.length;
		let char:string;
		for(let i=0;i<len;i++){
			char = txt.charAt(i);
			if(char == "."){
				textureCache[char] = RES.getRes(pngName + "dot" + "_png");
			}else{
				textureCache[char] = RES.getRes(pngName + char + "_png");
			}
		}
	}

	/**
	 * 获取纹理缓存
	 * @param pngName 图片名
	 */
	public static getTextureCache(pngName:string){
		let textureCache = BitmapFont.textureCaches[pngName];
		if(textureCache == null){
			textureCache = [];
			BitmapFont.textureCaches[pngName] = textureCache;
		}
		return textureCache;
	}

	/**
	 * 设置文字
	 * @param txt 文字
	 */
	public set text(txt:string){
		let bmCaches = BitmapFont.bmCaches;
		let textureCache = BitmapFont.getTextureCache(this.pngName);
		let curLen = this.numChildren;
		let targetLen = txt.length;

		this._text = txt;

		//文字存在,且大于显示文字,则移除多余文字
		if(curLen > targetLen){
			let bm:egret.Bitmap;
			for(let i=curLen-1;i>=targetLen;i--){
				bm = this.removeChildAt(i) as egret.Bitmap;
				bm.texture = null;
				bmCaches.push(bm);
			}
		}
		//显示文字
		let bm:egret.Bitmap;
		let tempX:number = 0;
		let char:string;
		for(let i=0;i<targetLen;i++){
			//少于显示文字,则增加文字
			if(i >= curLen){
				if(bmCaches.length > 0){
					bm = bmCaches.pop();
				}else{
					bm = new egret.Bitmap();
				}
				this.addChild(bm);
			}
			bm = this.getChildAt(i) as egret.Bitmap;
			bm.texture =  textureCache[txt.charAt(i)];
			bm.x = tempX;
			tempX = bm.x + bm.width;
		}
	}

	/**
	 * 获取文字
	 */
	public get text(){
		return this._text;
	}

	/**销毁 */
	public destroy(){
		//回收bitmap
		let len = this.numChildren;
		let bm:egret.Bitmap;
		let bmCaches = BitmapFont.bmCaches;
		for(let i=len-1;i>=0;i--){
			bm = this.getChildAt(i) as egret.Bitmap;
			this.removeChild(bm);
			bm.texture = null;
			bmCaches.push(bm);
		}
		//从视图移除
		this.parent && this.parent.removeChild(this);
	}
}

  

使用方法

        //注册文字
        BitmapFont.initByOne("font_test", "02345");
        BitmapFont.initByMulti("font","02.");

        //单张整图的文字
        let bm:BitmapFont = new BitmapFont("font_test");
        bm.x = 100;
        bm.y = 100;
        bm.text = "02333";
        this.addChild(bm);

        //多张图的文字
        let bm2:BitmapFont = new BitmapFont("font");
        bm2.x  = 200;
        bm2.y = 200;
        bm2.text = "02.02.";
        this.addChild(bm2);

  

运行效果

原文地址:https://www.cnblogs.com/gamedaybyday/p/11832069.html

时间: 2024-11-09 02:43:23

Egret自定义位图文字的相关文章

Laya的位图文字,高亮文字,图文混排

测试版本:Laya 2.1.1.1 位图文字 白鹭的位图文字是由TextureMerger制作,然后在exml里使用. Laya的则直接使用FontClip组件. 在编辑模式,层级窗口中右键,选择创建组件UI,选择FontClip 将美术提供的位图文字赋值给FontClip的属性面板的skin属性,这样就是个位图文字了.比白鹭要方便些. 高亮文字 白鹭的高亮文字有文本样式 tx.textFlow = <Array<egret.ITextElement>>[ {text: "

Android开发之自定义TabHost文字及背景(源代码分享)

使用TabHost 可以在一个屏幕间进行不同版面的切换,而系统自带的tabhost界面较为朴素,我们应该如何进行自定义修改优化呢 MainActivity的源代码 package com.dream.ledong; import android.app.TabActivity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.Gr

【Android】Android实现自定义带文字和图片的Button

在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小.在Button的属性中有一个是drawableLeft,这个属性可以把图片设置在文字的左边,但是这种方式必须让icon的背景色是透明的,如果icon的背景色不是透明的话,会导致点击按钮时icon部分的背景色不会发生变化. 主要代码: <Button android:id="@+id/bt3

自定义超链接文字提示效果

自定义超链接文字提示和自带的超链接提示相比具有响应时间更快,更加美观的优点~ 1 /* 超链接文字提示 */ 2 $(function(){ 3 var x = 10; 4 var y = 20; 5 $("a.tooltip").mouseover(function(e){ 6 this.myTitle = this.title; 7 this.title = ""; 8 var tooltip = "<div id='tooltip'>&q

Android之自定义画图文字动画

结构: BaseView: package com.caiduping.canvas; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; public abstract class BaseView extends View{ //线程 private MyThread myThread; publi

Android自定义“图片+文字”控件四种实现方法之 二--------个人最推荐的一种

http://blog.csdn.net/yanzi1225627/article/details/8633872 第二种方法也要新建一个图片+文字的xml布局文件,然后写一个类继承自LinearLayout.在主程序里实例化并设置相应参数.这种方式也是我最推荐的一种. 第一部分:myimgbtn_layout.xml [html] view plaincopyprint? <?xml version="1.0" encoding="utf-8"?> &

css3应用之自定义选中文字的背景颜色

在看很多的博客主题时候发现大多数都对选中文字的背景颜色做了相应的处理.其实这样是很符合用户体验的.因为有很多的人会用鼠标选择着一行一行的阅读.其中就包括本人... 浏览器中默认的选中的文字颜色为白色,背景色为蓝色. 我们如何自定义呢? 效果参见本博客,选中文字后可以见到效果.本博客中用到的代码是 body ::selection {color:#FFFFFF;text-shadow:none;}body ::-moz-selection {color:#FFFFFF;background-col

Android 自定义spinner文字颜色 和 显示样式

项目中界面,有几个数值不允许用户输入,只能在下拉列表中选择项目,一开始想过自定义dialog或者popupwindow,但是会额外增加很多代码,考虑到现在的工程代码量已经很多了,所以想到了使用google已经开发好的组件spinner组件,这是一个非常好用的系统下拉选项组件,具体的用法我就不多说了,有很多已经总结过了,大概的流程就是先设置spinner控件,如下: Spinner< android:id="@+id/touchprice" android:layout_width

Egret之位图字体

1 , 关于位图字体的制作 2 , egret官方提供的资源 看看cartoon-font.fnt的内容 {"file":"cartoon-font.png","frames":{ "A":{"x":1,"y":54,"w":21,"h":24,"offX":2,"offY":11,"sourceW