转载自:http://blog.csdn.net/li6185377/article/details/7255809

由于Opengl 本身是没有DrawString 这种函数的 所以我们要实现最简单的办法 字写在图片上 在把图片转为Texture 进行绘图

下面是我封装好的类

[java] view plain copy
  1. packageljh.opengl.command;
  2. importjava.util.ArrayList;
  3. importjava.util.HashMap;
  4. importjava.util.Vector;
  5. importljh.opengl.GLEx;
  6. importljh.opengl.LColor;
  7. importljh.opengl.LTexture;
  8. importandroid.graphics.Bitmap;
  9. importandroid.graphics.Canvas;
  10. importandroid.graphics.Bitmap.Config;
  11. importandroid.graphics.Paint;
  12. publicclassGLFont{
  13. //要打印的字字体大小字的信息最大宽度
  14. publicstaticBitmapgetImage(Stringstr,intfontsize,Paintpaint,
  15. intmaxWidth){
  16. String[]text=StringFormat(str,maxWidth,fontsize);
  17. int[]count=getLinesMaxLength(text);
  18. Bitmapbitmap=Bitmap.createBitmap(count[0]*(fontsize/2)
  19. +count[1]*fontsize+5,(text.length)*fontsize,
  20. Config.ARGB_8888);
  21. Canvascanvas=newCanvas(bitmap);
  22. paint.setTextSize(fontsize);
  23. for(inti=0;i<text.length;i++){
  24. canvas.drawText(text[i],0,(i+1)*fontsize-3,paint);
  25. }
  26. returnbitmap;
  27. }
  28. //具体的方法还好我们前面实现了DrawTexture我们这边就不用多写一次了
  29. publicstaticvoiddrawString(GLExgl,Stringstr,floatx,floaty,Paintpaint,intmaxWidth){
  30. if(str==null||str.trim()=="")
  31. return;
  32. Stringkey=str.trim().toLowerCase();
  33. LTexturetexture=data.get(key);
  34. if(texture==null)
  35. {
  36. Bitmapbitmap=getImage(str,(int)paint.getTextSize(),paint,maxWidth);
  37. texture=newLTexture(bitmap);
  38. data.put(key,texture);
  39. }
  40. gl.drawTexture(texture,x,y);
  41. }
  42. //保存着写过的字的纹理当渲染到一定次数还没使用的将被销毁
  43. publicstaticHashMap<String,LTexture>data=newHashMap<String,LTexture>();
  44. //保存要销毁的纹理
  45. privatestaticArrayList<String>UnusedList=newArrayList<String>();
  46. //渲染线程没运行一次次函数运行一次
  47. publicstaticvoidupdate()
  48. {
  49. for(Stringkey:data.keySet())
  50. {
  51. LTexturetexture=data.get(key);
  52. if(texture.isUnused())
  53. {
  54. UnusedList.add(key);
  55. }
  56. else
  57. {
  58. texture.addUnused();
  59. }
  60. }
  61. for(Stringkey:UnusedList)
  62. {
  63. GLEx.glex.delete(data.remove(key));
  64. }
  65. UnusedList.clear();
  66. }
  67. /**
  68. *返回字数最多的那个行中中英文的数量
  69. *
  70. *@paramlines
  71. *@returnint[0]英文的数量int[1]中文的数量
  72. */
  73. publicstaticint[]getLinesMaxLength(String[]lines){
  74. intmax=0,index=0;
  75. for(inti=0;i<lines.length;i++){
  76. if(max<lines[i].getBytes().length){
  77. max=lines[i].getBytes().length;
  78. index=i;
  79. }
  80. }
  81. int[]count=newint[2];
  82. for(inti=0;i<lines[index].length();i++){
  83. if(lines[index].charAt(i)>255){
  84. count[1]++;
  85. }else{
  86. count[0]++;
  87. }
  88. }
  89. returncount;
  90. }
  91. //对String进行分段
  92. publicstaticString[]StringFormat(Stringtext,intmaxWidth,intfontSize){
  93. String[]result=null;
  94. Vector<String>tempR=newVector<String>();
  95. intlines=0;
  96. intlen=text.length();
  97. intindex0=0;
  98. intindex1=0;
  99. booleanwrap;
  100. while(true){
  101. intwidthes=0;
  102. wrap=false;
  103. for(index0=index1;index1<len;index1++){
  104. if(text.charAt(index1)=='\n'){
  105. index1++;
  106. wrap=true;
  107. break;
  108. }
  109. widthes=fontSize+widthes;
  110. if(widthes>maxWidth){
  111. break;
  112. }
  113. }
  114. lines++;
  115. if(wrap){
  116. tempR.addElement(text.substring(index0,index1-1));
  117. }else{
  118. tempR.addElement(text.substring(index0,index1));
  119. }
  120. if(index1>=len){
  121. break;
  122. }
  123. }
  124. result=newString[lines];
  125. tempR.copyInto(result);
  126. returnresult;
  127. }
  128. }

更多相关文章

  1. Andrid中的plurals
  2. Android(安卓)中英文切换工具类
  3. android GPS 获取卫星数量
  4. android text 中英文混排 换行的问题
  5. android driver开发常见的英文缩写
  6. Unity3D调用Android系统相册
  7. Android(安卓)?Pixelflinger 研究
  8. 三、Pocketsphinx_Android中英文小范围高准确率
  9. 2012-06-13 16:50 Android限定EditText的输入类型为数字或者英文

随机推荐

  1. Android(安卓)- 动态设置自定义View的id
  2. 关于okhttp的线程管理思路
  3. Android客户端与PHP服务端RES公钥私钥互
  4. Android获取内存的不同方法总结
  5. Android(安卓)EditText不弹出输入法焦点
  6. android 动画效果
  7. 【Android】联通性 -- USB主机模式
  8. Android利用webservices实现图片远程上传
  9. laravel使用Dingo\Api通过response()->j
  10. 数据储存方式-SharedPreferences