注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

姑射道人的博客

博客新地址:nixuchen.com

 
 
 

日志

 
 

android opengl es 绘制位图字体  

2013-12-13 15:18:56|  分类: android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

1.Activity 类

  1. import android.app.Activity;  
  2. import android.opengl.GLSurfaceView;  
  3. import android.os.Bundle;  
  4.   
  5. public class FontOpenglActivity extends Activity {  
  6.    GLSurfaceView gView ;  
  7.    FontRenderer fontRenderer;  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         gView = new GLSurfaceView(this);  
  12.         fontRenderer = new FontRenderer();  
  13.         gView.setRenderer(fontRenderer);  
  14.         setContentView(gView);  
  15.     }  
  16. }  

2.渲染类

  1. import java.nio.ByteBuffer;  
  2. import java.nio.ByteOrder;  
  3. import java.nio.FloatBuffer;  
  4.   
  5. import javax.microedition.khronos.egl.EGLConfig;  
  6. import javax.microedition.khronos.opengles.GL;  
  7. import javax.microedition.khronos.opengles.GL10;  
  8.   
  9. import android.graphics.Bitmap;  
  10. import android.graphics.BitmapFactory;  
  11. import android.graphics.Canvas;  
  12. import android.graphics.Color;  
  13. import android.graphics.Paint;  
  14. import android.graphics.Typeface;  
  15. import android.opengl.GLUtils;  
  16. import android.opengl.GLSurfaceView.Renderer;  
  17.   
  18. public class FontRenderer implements Renderer {  
  19.     //位图  
  20.     private Bitmap bitmap;  
  21.     //四边形的顶点坐标系  
  22.     private float[] vertex = new float[]{  
  23.             -2.5f,-2.5f,0,  
  24.             2.5f,-2.5f,0,  
  25.             -2.5f,2.5f,0,  
  26.             2.5f,2.5f,0  
  27.     };  
  28.     //纹理坐标系  
  29.     private float[] coord = new float[]{  
  30.             0,1.0f,  
  31.             1.0f,1.0f,  
  32.             0,0,  
  33.             1.0f,0  
  34.     };  
  35.     //纹理存储定义,一般用来存名称  
  36.     private int[] textures = new int[1];  
  37.     //顶点、纹理缓冲  
  38.     FloatBuffer vertexBuffer;  
  39.     FloatBuffer coordBuffer;  
  40.       
  41.     @Override  
  42.     public void onDrawFrame(GL10 gl) {  
  43.         gl.glClear(GL10.GL_DEPTH_BUFFER_BIT|GL10.GL_COLOR_BUFFER_BIT);  
  44.         gl.glLoadIdentity();  
  45.           
  46.         //准备顶点缓冲  
  47.         ByteBuffer bb = ByteBuffer.allocateDirect(vertex.length * 4);  
  48.         bb.order(ByteOrder.nativeOrder());  
  49.         vertexBuffer = bb.asFloatBuffer();  
  50.         vertexBuffer.put(vertex);  
  51.         vertexBuffer.position(0);  
  52.         //准备纹理缓冲  
  53.         ByteBuffer coordbb = ByteBuffer.allocateDirect(coord.length * 4);  
  54.         coordbb.order(ByteOrder.nativeOrder());  
  55.         coordBuffer = coordbb.asFloatBuffer();  
  56.         coordBuffer.put(coord);  
  57.         coordBuffer.position(0);  
  58.         //开启顶点和纹理缓冲  
  59.         gl.glEnableClientState(gl.GL_VERTEX_ARRAY);  
  60.         gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);  
  61.           
  62.         //往里面进去一点  
  63.         gl.glTranslatef(0.0f, 0.0f, -6.0f);  
  64.         //设置顶点和纹理的位置、类型  
  65.         gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);  
  66.         gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, coordBuffer);  
  67.         //绘图  
  68.         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 04);  
  69.         //取消缓冲  
  70.         gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);  
  71.         gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);  
  72.         //结束绘图  
  73.         gl.glFinish();  
  74.     }  
  75.   
  76.     @Override  
  77.     public void onSurfaceChanged(GL10 gl, int width, int height) {  
  78.         //设置场景大小  
  79.         gl.glViewport(00, width, height);  
  80.         float ratio = (float) width / height;  
  81.         //投影矩阵  
  82.         gl.glMatrixMode(GL10.GL_PROJECTION);  
  83.         //重置视图  
  84.         gl.glLoadIdentity();  
  85.         //设置视图的大小  
  86.         gl.glFrustumf(-ratio, ratio, -11115);  
  87.         // 设置观察模型  
  88.         gl.glMatrixMode(GL10.GL_MODELVIEW);  
  89.         gl.glLoadIdentity();  
  90.     }  
  91.   
  92.     @Override  
  93.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  94.         initFontBitmap();  
  95.           
  96.         gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);  
  97.         // 黑色背景色  
  98.         gl.glClearColorx(0000);  
  99.         // 启用阴影平滑  
  100.         gl.glShadeModel(GL10.GL_SMOOTH);  
  101.         // 启用深度测试  
  102.         gl.glEnable(GL10.GL_DEPTH_TEST);  
  103.         // 深度测试类型  
  104.         gl.glDepthFunc(GL10.GL_LEQUAL);  
  105.         // 设置深度缓存  
  106.         gl.glClearDepthf(1.0f);  
  107.   
  108.         // 启用纹理  
  109.         gl.glEnable(GL10.GL_TEXTURE_2D);  
  110.         // 创建纹理  
  111.          gl.glGenTextures(1, textures, 0);  
  112.         // 绑定纹理  
  113.          gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);  
  114.          //生成纹理  
  115.         GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);  
  116.   
  117.         //线性滤波  
  118.         gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,  
  119.                 GL10.GL_LINEAR);//放大时  
  120.         gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,  
  121.                 GL10.GL_LINEAR);//缩小时     
  122.     }  
  123.     /** 
  124.      * android中绘制字体,使用画布canvas 
  125.      */  
  126.     public void initFontBitmap(){  
  127.         String font = "需要渲染的文字测试!";  
  128.         bitmap = Bitmap.createBitmap(256256, Bitmap.Config.ARGB_8888);  
  129.         Canvas canvas = new Canvas(bitmap);  
  130.         //背景颜色  
  131.         canvas.drawColor(Color.LTGRAY);  
  132.         Paint p = new Paint();  
  133.         //字体设置  
  134.         String fontType = "宋体";  
  135.         Typeface typeface = Typeface.create(fontType, Typeface.BOLD);  
  136.         //消除锯齿  
  137.         p.setAntiAlias(true);  
  138.         //字体为红色  
  139.         p.setColor(Color.RED);  
  140.         p.setTypeface(typeface);  
  141.         p.setTextSize(28);  
  142.         //绘制字体  
  143.         canvas.drawText(font, 0100, p);  
  144.     }  
  145. }  

3、运行效果


  评论这张
 
阅读(528)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017