Android中绘制字体,用到了canvas,下面代码里面为我写的实例,几乎每行代码都有注释。

1.Activity 类

import android.app.Activity;import android.opengl.GLSurfaceView;import android.os.Bundle;public class FontOpenglActivity extends Activity {   GLSurfaceView gView ;   FontRenderer fontRenderer;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        gView = new GLSurfaceView(this);        fontRenderer = new FontRenderer();        gView.setRenderer(fontRenderer);        setContentView(gView);    }}

2.渲染类

import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.FloatBuffer;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL;import javax.microedition.khronos.opengles.GL10;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Typeface;import android.opengl.GLUtils;import android.opengl.GLSurfaceView.Renderer;public class FontRenderer implements Renderer {//位图private Bitmap bitmap;//四边形的顶点坐标系private float[] vertex = new float[]{-2.5f,-2.5f,0,2.5f,-2.5f,0,-2.5f,2.5f,0,2.5f,2.5f,0};//纹理坐标系private float[] coord = new float[]{0,1.0f,1.0f,1.0f,0,0,1.0f,0};//纹理存储定义,一般用来存名称private int[] textures = new int[1];//顶点、纹理缓冲FloatBuffer vertexBuffer;FloatBuffer coordBuffer;@Overridepublic void onDrawFrame(GL10 gl) {gl.glClear(GL10.GL_DEPTH_BUFFER_BIT|GL10.GL_COLOR_BUFFER_BIT);gl.glLoadIdentity();//准备顶点缓冲ByteBuffer bb = ByteBuffer.allocateDirect(vertex.length * 4);bb.order(ByteOrder.nativeOrder());vertexBuffer = bb.asFloatBuffer();vertexBuffer.put(vertex);vertexBuffer.position(0);//准备纹理缓冲ByteBuffer coordbb = ByteBuffer.allocateDirect(coord.length * 4);coordbb.order(ByteOrder.nativeOrder());coordBuffer = coordbb.asFloatBuffer();coordBuffer.put(coord);coordBuffer.position(0);//开启顶点和纹理缓冲gl.glEnableClientState(gl.GL_VERTEX_ARRAY);gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);//往里面进去一点gl.glTranslatef(0.0f, 0.0f, -6.0f);//设置顶点和纹理的位置、类型gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, coordBuffer);//绘图gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);//取消缓冲gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);//结束绘图gl.glFinish();}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {//设置场景大小gl.glViewport(0, 0, width, height);float ratio = (float) width / height;//投影矩阵gl.glMatrixMode(GL10.GL_PROJECTION);//重置视图gl.glLoadIdentity();//设置视图的大小gl.glFrustumf(-ratio, ratio, -1, 1, 1, 15);// 设置观察模型gl.glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {initFontBitmap();gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);// 黑色背景色gl.glClearColorx(0, 0, 0, 0);// 启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 深度测试类型gl.glDepthFunc(GL10.GL_LEQUAL);// 设置深度缓存gl.glClearDepthf(1.0f);// 启用纹理gl.glEnable(GL10.GL_TEXTURE_2D);// 创建纹理 gl.glGenTextures(1, textures, 0);// 绑定纹理 gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); //生成纹理GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);//线性滤波gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);//放大时gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);//缩小时}/** * android中绘制字体,使用画布canvas */public void initFontBitmap(){String font = "需要渲染的文字测试!";bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);//背景颜色canvas.drawColor(Color.LTGRAY);Paint p = new Paint();//字体设置String fontType = "宋体";Typeface typeface = Typeface.create(fontType, Typeface.BOLD);//消除锯齿p.setAntiAlias(true);//字体为红色p.setColor(Color.RED);p.setTypeface(typeface);p.setTextSize(28);//绘制字体canvas.drawText(font, 0, 100, p);}}

3、运行效果



更多相关文章

  1. Please ensure that adb is correctly located at '/home/lq/and
  2. Android(安卓)UI之TextView实现图文混合效果
  3. 最短路径之狄克斯特拉(Dijkstra)算法
  4. 被裁老程序员再就业计划之我可以用Dijkstra算法在回龙观送外卖
  5. Android中如何制作游戏的启动菜单
  6. 在英特尔® 凌动™ 处理器上将 OpenGL* 游戏移植到 Android* (第
  7. Android 上的 制表符(tab) —— 一个神奇的字符 (cocos2dx crash)
  8. android之各种图形绘制
  9. android下自定义字体的使用方法

随机推荐

  1. XML基本概念入门介绍
  2. XML入门教程:XSLT-XML/XSLT的代码实例
  3. .net读写xml文档详解
  4. XML中的DTD文档类型定义完全解析的示例代
  5. php解析xml方法实例(附代码)详细说明
  6. XML入门教程:详细介绍XHTM模块
  7. 浅谈WEB页面工具语言XML(四)应用分类
  8. xml语法详细说明
  9. XML入门教程:XLink-XML/XSLT的具体分析
  10. 浅谈WEB页面工具语言XML(三)支持工具