转载自:http://blog.csdn.net/li6185377/article/details/7255809
由于Opengl 本身是没有DrawString 这种函数的 所以我们要实现最简单的办法 字写在图片上 在把图片转为Texture 进行绘图
下面是我封装好的类
- package ljh.opengl.command;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Vector;
- import ljh.opengl.GLEx;
- import ljh.opengl.LColor;
- import ljh.opengl.LTexture;
- import android.graphics.Bitmap;
- import android.graphics.Canvas;
- import android.graphics.Bitmap.Config;
- import android.graphics.Paint;
- public class GLFont {
- //要打印的字 字体大小 字的信息 最大宽度
- public static Bitmap getImage(String str, int fontsize, Paint paint,
- int maxWidth) {
- String[] text = StringFormat(str, maxWidth, fontsize);
- int[] count = getLinesMaxLength(text);
- Bitmap bitmap = Bitmap.createBitmap(count[0] * (fontsize / 2)
- + count[1] * fontsize +5, (text.length) * fontsize,
- Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- paint.setTextSize(fontsize);
- for (int i = 0; i < text.length; i++) {
- canvas.drawText(text[i], 0, (i+1) * fontsize -3, paint);
- }
- return bitmap;
- }
- //具体的方法 还好我们前面实现了DrawTexture 我们这边就不用多写一次了
- public static void drawString(GLEx gl, String str, float x, float y,Paint paint,int maxWidth) {
- if(str==null||str.trim()=="")
- return;
- String key = str.trim().toLowerCase();
- LTexture texture = data.get(key);
- if(texture==null)
- {
- Bitmap bitmap = getImage(str, (int)paint.getTextSize(), paint, maxWidth);
- texture = new LTexture(bitmap);
- data.put(key, texture);
- }
- gl.drawTexture(texture, x, y);
- }
- //保存着写过的字的纹理 当渲染到一定次数 还没使用的将被销毁
- public static HashMap<String, LTexture> data = new HashMap<String, LTexture>();
- //保存要销毁的纹理
- private static ArrayList<String> UnusedList = new ArrayList<String>();
- //渲染线程没运行一次 次函数运行一次
- public static void update()
- {
- for(String key:data.keySet())
- {
- LTexture texture = data.get(key);
- if(texture.isUnused())
- {
- UnusedList.add(key);
- }
- else
- {
- texture.addUnused();
- }
- }
- for(String key:UnusedList)
- {
- GLEx.glex.delete(data.remove(key));
- }
- UnusedList.clear();
- }
- /**
- * 返回字数最多的那个行中中英文的数量
- *
- * @param lines
- * @return int[0] 英文的数量 int[1] 中文的数量
- */
- public static int[] getLinesMaxLength(String[] lines) {
- int max = 0, index = 0;
- for (int i = 0; i < lines.length; i++) {
- if (max < lines[i].getBytes().length) {
- max = lines[i].getBytes().length;
- index = i;
- }
- }
- int[] count = new int[2];
- for (int i = 0; i < lines[index].length(); i++) {
- if (lines[index].charAt(i) > 255) {
- count[1]++;
- } else {
- count[0]++;
- }
- }
- return count;
- }
- //对String 进行分段
- public static String[] StringFormat(String text, int maxWidth, int fontSize) {
- String[] result = null;
- Vector<String> tempR = new Vector<String>();
- int lines = 0;
- int len = text.length();
- int index0 = 0;
- int index1 = 0;
- boolean wrap;
- while (true) {
- int widthes = 0;
- wrap = false;
- for (index0 = index1; index1 < len; index1++) {
- if (text.charAt(index1) == '\n') {
- index1++;
- wrap = true;
- break;
- }
- widthes = fontSize + widthes;
- if (widthes > maxWidth) {
- break;
- }
- }
- lines++;
- if (wrap) {
- tempR.addElement(text.substring(index0, index1 - 1));
- } else {
- tempR.addElement(text.substring(index0, index1));
- }
- if (index1 >= len) {
- break;
- }
- }
- result = new String[lines];
- tempR.copyInto(result);
- return result;
- }
- }