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;
}