利用Android游戏引擎Angle开发界面——显示汉字
2013-04-28 16:30
351 查看
Angle不支持汉字的显示,内带的AngleFont,对E文的支持是没问题。AngleFont通过把字符变为Bitmap的方式来加载字库,准备纹理。对于汉字字库,这个过程会耗时很长,全部加载进来,占用内存也很多;如果部分加载、根据使用频度更新字库缓存,算法又太麻烦。
我使用的是笨方法,先使用Android的Canvas,把汉字绘制到内存图片,然后根据图片生成一个AngleSprite(含配套的AngleSpriteLayout及AngleSpriteLayout关联的Texture)。下面是转换汉字为Bitmap的类,支持单行文本绘制,可以根据需要做省略处理。
仅仅是上面的处理还不够,生成了一个Bitmap,还需要转变成纹理。
Angle类库中的AngleTextureEngine只能从Resouce中加载纹理。第一步,我修改了AngleTextureEngine类,添加了下面的方法以便从已有的Bitmap生成纹理对象。
第二步,还要修改AngleSpriteLayout类来支持从Bitmap创建纹理,添加下面两个方法(没有指定cropWidth和cropHeight,只指定纹理尺寸width和height)。
上面两个方法调用的doInit函数,我参考AngleSpriteLayout类原有的doInit函数做了重载。
第三步,还得实现一个纹理类AngleBitmapTexture。代码如下:
好了,准备工作完成了,下面看怎么使用。其实很简单,举个例子:
OK,到此为止,可以正常显示汉字了,就是不知道性能如何。我在上面的代码中,加了些测试的代码,创建耗时还不算太多,在我的设备上,创建30个字符串文理,150毫秒左右。
似乎应该先分析一下Angle引擎的框架,不过代码和类都不太多,比较容易理清楚,阅读代码花不了太多时间,等我有时间再补了。这也可能是这个引擎没有文档的原因之一,作者认为代码可以说明大部分东西,不需要。
我使用的是笨方法,先使用Android的Canvas,把汉字绘制到内存图片,然后根据图片生成一个AngleSprite(含配套的AngleSpriteLayout及AngleSpriteLayout关联的Texture)。下面是转换汉字为Bitmap的类,支持单行文本绘制,可以根据需要做省略处理。
public final class StringToBitmap { public static Bitmap getBitmapFromSingleLineString(String text, int textColor, int backgroundColor, String fontType, int fontSize, int bitmapWidth, int bitmapHeight, Paint.Align align) { Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); // 背景颜色 canvas.drawColor(backgroundColor); TextPaint paint = new TextPaint(); Typeface typeface = Typeface.create(fontType, Typeface.NORMAL); // 消除锯齿 paint.setAntiAlias(true); // 字体为红色 paint.setColor(textColor); paint.setTypeface(typeface); paint.setTextSize(fontSize); paint.setTextAlign(align); CharSequence truncateText = TextUtils.ellipsize(text, paint , bitmapWidth, TextUtils.TruncateAt.END); // 绘制字体 canvas.drawText(truncateText, 0, truncateText.length(), 0, bitmapHeight - 1, paint); return bitmap; } }
仅仅是上面的处理还不够,生成了一个Bitmap,还需要转变成纹理。
Angle类库中的AngleTextureEngine只能从Resouce中加载纹理。第一步,我修改了AngleTextureEngine类,添加了下面的方法以便从已有的Bitmap生成纹理对象。
public AngleTexture createTextureFromBitmap(Bitmap bitmap) { AngleTexture tex = null; Iterator<AngleTexture> it = mTexturesX.iterator(); while (it.hasNext()) { tex = it.next(); if (tex instanceof AngleBitmapTexture) { // Texture already exists if (((AngleBitmapTexture) tex).mBitmap == bitmap) { tex.mRefernces++; return tex; } } } tex = new AngleBitmapTexture(this, bitmap); mTexturesX.add(tex); return tex; }
第二步,还要修改AngleSpriteLayout类来支持从Bitmap创建纹理,添加下面两个方法(没有指定cropWidth和cropHeight,只指定纹理尺寸width和height)。
public AngleSpriteLayout(AngleSurfaceView view, Bitmap bitmap) { doInit(view, 0, 0, bitmap); } public AngleSpriteLayout(AngleSurfaceView view, int width, int height, Bitmap bitmap) { doInit(view, width, height, bitmap); }
上面两个方法调用的doInit函数,我参考AngleSpriteLayout类原有的doInit函数做了重载。
第三步,还得实现一个纹理类AngleBitmapTexture。代码如下:
public class AngleBitmapTexture extends AngleTexture { protected Bitmap mBitmap; public AngleBitmapTexture(AngleTextureEngine textureEngine, Bitmap bmp) { super(textureEngine); mBitmap = bmp; } @Override public Bitmap create() { return mBitmap; } void setBitmap(Bitmap bitmap){ mBitmap = bitmap; mTextureEngine.releaseHWTexture(this); } }
好了,准备工作完成了,下面看怎么使用。其实很简单,举个例子:
long t = System.currentTimeMillis(); AngleObject textHolder = mGLSurfaceView.addObject(new AngleObject()); int x = 120; int y = 100; for (int i = 0; i < 30; i++) { if (i % 6 == 0) { y += 60; x = 120; } AngleSprite textSprite = new AngleSprite(x, y, new AngleSpriteLayout(mGLSurfaceView, 190, 50, StringToBitmap.getBitmapFromSingleLineString( "渲染测试中" + i, 0xFFEEEEEE, 0x00000000, "宋体", 28, 190, 50, Paint.Align.LEFT))); textHolder.addObject(textSprite); x += 200; } Log.v("StringBitmap", "create 30 string bitmap, use: " + (System.currentTimeMillis() - t));
OK,到此为止,可以正常显示汉字了,就是不知道性能如何。我在上面的代码中,加了些测试的代码,创建耗时还不算太多,在我的设备上,创建30个字符串文理,150毫秒左右。
似乎应该先分析一下Angle引擎的框架,不过代码和类都不太多,比较容易理清楚,阅读代码花不了太多时间,等我有时间再补了。这也可能是这个引擎没有文档的原因之一,作者认为代码可以说明大部分东西,不需要。
相关文章推荐
- 利用Android游戏引擎Angle开发界面
- android游戏开发框架libgdx的使用(三)--中文显示与汉字绘制
- libgdx游戏引擎开发笔记(九)SuperJumper游戏例子的讲解(篇三)---- 主游戏界面显示框架
- Android游戏引擎libgdx使用教程3:绘制汉字与显示中文
- libgdx游戏引擎开发笔记(九)SuperJumper游戏例子的讲解(篇三)---- 主游戏界面显示框架
- android游戏开发框架libgdx的使用(三)--中文显示与汉字绘制
- 【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)
- 【Android LibGDX游戏引擎开发教程】第07期:中文字体的显示和绘制(上)
- 【Android LibGDX游戏引擎开发教程】第07期:中文字体的显示和绘制(上)
- android游戏开发框架libgdx的使用(三)--中文显示与汉字绘制
- 【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)
- Python游戏引擎开发(三):显示图片
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- 【Android开发学习28】界面控件之列表控件(ListView)--显示字符数组
- 【Android LibGDX游戏引擎开发教程】第06期:图形图像的绘制(下)图片整合工具的使用
- Android开发界面显示慢-过度绘制优化
- 【OpenGL游戏开发之五】freetype2 显示汉字
- cocos2d-x(quick--cocos2d-x)引擎开发的游戏在android平台上,锁屏,按HOME键,重反游戏后黑屏问题
- Android 3D游戏开发(高级篇)——Opengl ES游戏引擎实现(更新完毕)
- JAVA Eclipse开发Android如何让超出界面的部分自动显示滚动条