Angle不支持汉字的显示,内带的AngleFont,对E文的支持是没问题。AngleFont通过把字符变为Bitmap的方式来加载字库,准备纹理。对于汉字字库,这个过程会耗时很长,全部加载进来,占用内存也很多;如果部分加载、根据使用频度更新字库缓存,算法又太麻烦。

我使用的是笨方法,先使用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 existsif (((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;}@Overridepublic 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引擎的框架,不过代码和类都不太多,比较容易理清楚,阅读代码花不了太多时间,等我有时间再补了。这也可能是这个引擎没有文档的原因之一,作者认为代码可以说明大部分东西,不需要。



更多相关文章

  1. Android版俄罗斯方块的实现
  2. Android团队成员间的代码共享!(Git+Github版)
  3. Android: 记一次Android内存泄露
  4. Android(安卓)OpenGL ES2.0从放弃到入门(五)——绘制3D模型(obj+mtl
  5. 使用vs2010查看android原生代码
  6. 分享开发 Android(安卓)手机应用的开发经验——QR生成器
  7. 在Android系统使用socket在Java层和native之间数据通信
  8. Android(安卓)内置群组,联系人
  9. android -- sim/usim卡导联系人

随机推荐

  1. 2011.10.19(3)——— android 一个便签的Wi
  2. 模仿京东-上下左右滑动冲突
  3. android 访问SMS短信收件箱
  4. msm8909编译环境搭建
  5. 【译】Android(安卓)多媒体扫描过程(Andro
  6. android常用样式
  7. Android(安卓)之 ContentProvider 共享数
  8. 【android】Eclipse集成android开发环境(I
  9. android 检查网络连接状态实现步骤
  10. Android(安卓)中文API (69) —— Bluetooth