OpenlGl es 绘制汉字

原创

这个是在解决小白遇到的实际问题时写的一个方法,因为有一个输入bitmap的接口已经写好了,所以自己写了个方法如下:

获取要绘制的文字String name,输出 该文字的Bitmap:

 public Bitmap getBitmapHover(String paramDisplay) {

        Bitmap bmp = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
        Canvas canvasTemp = new Canvas(bmp);

        canvasTemp.drawColor(Color.argb(127,15,12,14)); //半透明灰色背景
        TextPaint textPaint = new TextPaint();

        String familyName = "楷体";
        Typeface font = Typeface.create(familyName, Typeface.BOLD);

        textPaint.setColor(Color.WHITE);
        textPaint.setTypeface(font);
        textPaint.setTextSize(200.0F);

       
        StaticLayout layout = new StaticLayout(paramDisplay,textPaint,canvasTemp.getWidth(), Layout.Alignment.ALIGN_CENTER,10.0F,0.0F,false);
        canvasTemp.translate(0,60);
        layout.draw(canvasTemp);

        return bmp;
}

转载

这个应该是比较通用的方法:



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);  
    }  
}  


</pre><pre code_snippet_id="1886852" snippet_file_name="blog_20160919_4_6582455" name="code" class="java">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;  
      
    @Override  
    public 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();  
    }  
  
    @Override  
    public 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();  
    }  
  
    @Override  
    public 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);  
    }  
}  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值