利用Android游戏引擎Angle开发界面——显示汉字


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 exists
    if (((AngleBitmapTexture) tex).mBitmap == bitmap)
    {
     tex.mRefernces++;
     return tex;
    }
   }
  }

  tex = new AngleBitmapTexture(this, bitmap);
  mTexturesX.add(tex);
  return tex;
 }

  • 1
  • 2
  • 下一页

相关内容