Android(安卓)Opengl es 写字 笔记
16lz
2021-01-26
转载自:http://blog.csdn.net/li6185377/article/details/7255809
由于Opengl 本身是没有DrawString 这种函数的 所以我们要实现最简单的办法 字写在图片上 在把图片转为Texture 进行绘图
下面是我封装好的类
[java] view plain copy- packageljh.opengl.command;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.Vector;
- importljh.opengl.GLEx;
- importljh.opengl.LColor;
- importljh.opengl.LTexture;
- importandroid.graphics.Bitmap;
- importandroid.graphics.Canvas;
- importandroid.graphics.Bitmap.Config;
- importandroid.graphics.Paint;
- publicclassGLFont{
- //要打印的字字体大小字的信息最大宽度
- publicstaticBitmapgetImage(Stringstr,intfontsize,Paintpaint,
- intmaxWidth){
- String[]text=StringFormat(str,maxWidth,fontsize);
- int[]count=getLinesMaxLength(text);
- Bitmapbitmap=Bitmap.createBitmap(count[0]*(fontsize/2)
- +count[1]*fontsize+5,(text.length)*fontsize,
- Config.ARGB_8888);
- Canvascanvas=newCanvas(bitmap);
- paint.setTextSize(fontsize);
- for(inti=0;i<text.length;i++){
- canvas.drawText(text[i],0,(i+1)*fontsize-3,paint);
- }
- returnbitmap;
- }
- //具体的方法还好我们前面实现了DrawTexture我们这边就不用多写一次了
- publicstaticvoiddrawString(GLExgl,Stringstr,floatx,floaty,Paintpaint,intmaxWidth){
- if(str==null||str.trim()=="")
- return;
- Stringkey=str.trim().toLowerCase();
- LTexturetexture=data.get(key);
- if(texture==null)
- {
- Bitmapbitmap=getImage(str,(int)paint.getTextSize(),paint,maxWidth);
- texture=newLTexture(bitmap);
- data.put(key,texture);
- }
- gl.drawTexture(texture,x,y);
- }
- //保存着写过的字的纹理当渲染到一定次数还没使用的将被销毁
- publicstaticHashMap<String,LTexture>data=newHashMap<String,LTexture>();
- //保存要销毁的纹理
- privatestaticArrayList<String>UnusedList=newArrayList<String>();
- //渲染线程没运行一次次函数运行一次
- publicstaticvoidupdate()
- {
- for(Stringkey:data.keySet())
- {
- LTexturetexture=data.get(key);
- if(texture.isUnused())
- {
- UnusedList.add(key);
- }
- else
- {
- texture.addUnused();
- }
- }
- for(Stringkey:UnusedList)
- {
- GLEx.glex.delete(data.remove(key));
- }
- UnusedList.clear();
- }
- /**
- *返回字数最多的那个行中中英文的数量
- *
- *@paramlines
- *@returnint[0]英文的数量int[1]中文的数量
- */
- publicstaticint[]getLinesMaxLength(String[]lines){
- intmax=0,index=0;
- for(inti=0;i<lines.length;i++){
- if(max<lines[i].getBytes().length){
- max=lines[i].getBytes().length;
- index=i;
- }
- }
- int[]count=newint[2];
- for(inti=0;i<lines[index].length();i++){
- if(lines[index].charAt(i)>255){
- count[1]++;
- }else{
- count[0]++;
- }
- }
- returncount;
- }
- //对String进行分段
- publicstaticString[]StringFormat(Stringtext,intmaxWidth,intfontSize){
- String[]result=null;
- Vector<String>tempR=newVector<String>();
- intlines=0;
- intlen=text.length();
- intindex0=0;
- intindex1=0;
- booleanwrap;
- while(true){
- intwidthes=0;
- wrap=false;
- for(index0=index1;index1<len;index1++){
- if(text.charAt(index1)=='\n'){
- index1++;
- wrap=true;
- break;
- }
- widthes=fontSize+widthes;
- if(widthes>maxWidth){
- break;
- }
- }
- lines++;
- if(wrap){
- tempR.addElement(text.substring(index0,index1-1));
- }else{
- tempR.addElement(text.substring(index0,index1));
- }
- if(index1>=len){
- break;
- }
- }
- result=newString[lines];
- tempR.copyInto(result);
- returnresult;
- }
- }
更多相关文章
- Andrid中的plurals
- Android(安卓)中英文切换工具类
- android GPS 获取卫星数量
- android text 中英文混排 换行的问题
- android driver开发常见的英文缩写
- Unity3D调用Android系统相册
- Android(安卓)?Pixelflinger 研究
- 三、Pocketsphinx_Android中英文小范围高准确率
- 2012-06-13 16:50 Android限定EditText的输入类型为数字或者英文