Android GLSurfaceView用法详解(二)

      输入如何处理
       若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件。下面有个例子:

java代码:

  1. package eoe.ClearTest;
  2. import javax.microedition.khronos.egl.EGLConfig;
  3. import javax.microedition.khronos.opengles.GL10;
  4. import android.app.Activity;
  5. import android.content.Context;
  6. import android.opengl.GLSurfaceView;
  7. import android.os.Bundle; 
  8. import android.view.MotionEvent; 
  9. public class ClearActivity extends Activity 
  10. { 
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState)
  13. { 
  14. super.onCreate(savedInstanceState); 
  15. mGLView = new ClearGLSurfaceView(this);
  16. setContentView(mGLView); 
  17. }
  18. @Override
  19. protected void onPause() 
  20. { 
  21. super.onPause();
  22. mGLView.onPause();
  23. }
  24. @Override
  25. protected void onResume() 
  26. { 
  27. super.onResume();
  28. mGLView.onResume();
  29. } 
  30. private GLSurfaceView mGLView;
  31. } 
  32. class ClearGLSurfaceView extends GLSurfaceView
  33. { 
  34. public ClearGLSurfaceView(Context context) 
  35. {
  36. super(context);
  37. mRenderer = new ClearRenderer();
  38. setRenderer(mRenderer); 
  39. }
  40. public boolean onTouchEvent(final MotionEvent event) 
  41. {
  42. queueEvent(new Runnable(){ public void run() 
  43. { mRenderer.setColor(event.getX() / getWidth(), event.getY() / getHeight()1.0f); }}); return true; } ClearRenderer mRenderer; }
  44. class ClearRenderer implements GLSurfaceView.Renderer 
  45. { 
  46. public void onSurfaceCreated(GL10 gl, EGLConfig config)
  47. { // Do nothing special. } 
  48. public void onSurfaceChanged(GL10 gl, int w, int h) 
  49. { gl.glViewport(0, 0, w, h); }
  50. public void onDrawFrame(GL10 gl) 
  51. { gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
  52. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  53. }
  54. public void setColor(float r, float g, float b) 
  55. {
  56. mRed = r; mGreen = g; mBlue = b; } 
  57. private float mRed;
  58. private float mGreen;
  59. private float mBlue;
  60. }
复制代码


        这个应用在每一帧中清空屏幕。当 tap 屏幕时,改变屏幕的颜色。这里在 ClearGLSurfaceView.onTouchEvent() 中使用了 queueEvent()。queueEvent() 方法用于在 UI 线程和渲染线程间通信。也可以用起它的 Java 线程通信技术,如 synchronized 方法,但 queueEvent 最简单的线程通信方法。

        其他的GLSurfaceView例子
        在Android SDK的API Demo例子程序中还有很多例子:
        GLSurfaceView
        Kube
        Translucent GLSurfaceView:透明背景
        Textured Triangle:纹理贴图
        Sprite Text:在 texture 上写文本并显示在 3D 场景中
        Touch Rotate:旋转 3D 对象

        选择一个Surface

        GLSurfaceView 提供了接口可选择 surface 的类型。默认情况下, GLSurfaceView 会使用一个 16 位 RGB frame buffer,带 16 位深度。你也可以根据自己的需要进行选择,比如在 Translucent GLSurfaceView 例子里,需要一个 Alpha 通道来实现透明。GLSurfaceView 提供了 setEGLSurfaceChooser()方法来选择 surface。
选择一个 RGB (565)的16位 framebuffer,接口如下:

       setEGLConfigChooser(boolean needDepth)若要定制 red, green, blue, alpha 和 depth,则用如下接口:
       setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,int depthSize, int stencilSize)使用自己实现的 EGLConfigChooser,用如下的接口:
       setEGLConfigChooser(EGLConfigChooser configChooser)持续型渲染模式 & 通知型渲染模式
       大多数 3D 应用,如游戏、模拟等都是持续型渲染的动画,还有些 3D 应用是反应式的(reactive),它们往往先被动等待,当用户有了动作再做出反应。对于这种应用,持续渲染屏幕是浪费时间。若开发反应式的应用,可以调用下面的方法
       GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY);停止持续渲染。当调用
       GLSurfaceView.requestRender()时,程序再渲染屏幕。

       调试
       GLSurfaceView.setDebugFlags() 方法可以激活log或者错误检测,它们可以帮助调试 OpenGL ES 调用。具体使用时,在 GLSurfaceView 的构造函数中,调用 setRender() 之前调用 GLSurfaceView.setDebugFlags()就可以了。下面是个例子:

java代码:

  1. public ClearGLSurfaceView(Context context)
  2. {
  3. super(context); 
  4. // Turn on error-checking and logging setDebugFlags(DEBUG_CHECK_GL_ERROR |DEBUG_LOG_GL_CALLS); 
  5. mRenderer = new ClearRenderer(); setRenderer(mRenderer); 
复制代码


系列之Android GLSurfaceView用法详解(一)的帖子链接http://www.eoeandroid.com/thread-96857-1-1.html

posted on 2016-05-03 13:57  Sun‘刺眼的博客  阅读(5098)  评论(0编辑  收藏  举报

导航