android opengl es 绘制位图字体
生活随笔
收集整理的這篇文章主要介紹了
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、運行效果
總結
以上是生活随笔為你收集整理的android opengl es 绘制位图字体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12月13日主题讨论日
- 下一篇: linux生成固定大小的文件夹的实现