android opengl es 绘制位图字体
来源:互联网 发布:net和java有什么区别 编辑:程序博客网 时间:2024/05/21 03:18
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、运行效果
- android opengl es 绘制位图字体
- android opengl es 位图字体
- openGL ES Android 三角形绘制
- openGL ES Android 绘制点
- android opengl es绘制三角形+纹理
- Android OpenGL ES 基础:绘制三角形
- Android OpenGL ES 2.0绘制简单三角形
- Android OpenGL ES 3D图形绘制
- Android OpenGL ES 2.0绘图:绘制纹理
- Android OpenGL ES 2.0绘图:绘制纹理
- 绘制位图字体
- OpenGL ES 绘制多边形
- OpenGL ES 绘制圆环
- OpenGL: 位图字体
- OpenGL 编程指南笔记——第8章 OpenGL 绘制像素、位图、字体和图像
- android中利用opengl es绘制一个球体
- Android OpenGL ES(八):绘制点Point
- Android OpenGL ES(九):绘制线段Line Segment
- linux产生随机数
- fedora16安装mysql
- Android中除了利用VideoView、Mediaplayer播放视频文件外,还可以用发送Intent来调用视频播放模块。
- [菜鸟专供|高手勿入] 快速判断质数
- Android实现文件下载
- android opengl es 绘制位图字体
- android UI 设计注意事项
- 常用的几种Hints优化一条SQL
- ASP.NET 中 “返回上一页”的实现方法小结
- ssh信任关系建立
- 动态库(.so)
- 为什么要使用接口 ? 研发的那些事3--接口之本
- ios中UIImageView展现图片的不同处理方式
- ADT-20 问题 android support library