1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > android opengl es 绘制位图字体

android opengl es 绘制位图字体

时间:2018-10-28 01:56:52

相关推荐

android opengl  es 绘制位图字体

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;@Overridepublic 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、运行效果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。