• 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

  • 相关阅读:
    模态框获取内容jQuery
    jQuery支持链式编程,一句话实现左侧table页+常用筛选器总结
    jquery实现全选、取消反选、加JavaScript三元运算(三种法法实现反选)
    用dom1来实现,根据光标移动自动给表单加上背景色,光标移开自动去除背景色
    JavaScript两种创建标签的的方法,实现点击按钮让text自增
    vue前端路由搜索功能实现
    pycharm配置vue
    QT全局事件和绑定
    mysql事务、锁
    web前端上传文件按钮自定义样式
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5454734.html
Copyright © 2020-2023  润新知