GLSurfaceView 线程交互 queueEvent

GLSurfaceView.Renderer 有三个方法:

onSurfaceCreated() :在开始渲染的时候被调用,无论什么时候OpenGL ES 渲染不得不重新被创建。(渲染是典型的丢失并重新创建当活动被暂停或恢复。)该方法一个创建长生命周期OpenGL资源(如材质)的好地方。

onSurfaceChanged():该方法在surface大小改变时被调用。这是设置你opengl视图端的好地方。如果相机是固定的,不会围着场景移动,你也可以在这里设置你的相机。

onDrawFrame():每帧的时候该方法都会被调用,这个用于画场景是可靠的。你完全可以通过调用glClear方法开清楚帧缓存,接着通过其他的opengl ES来调用画当前的场景。

用户如何输入?

假如你想做一个可以交互的程序(如游戏),通常你会实现GLSurfaceView子类,因为这是很容易获取用户输入事件。以下代码是一个清晰的长例子展示给你怎样做到这个:


    package com.javaeye.googlers;  
      
    import javax.microedition.khronos.egl.EGLConfig;  
    import javax.microedition.khronos.opengles.GL10;  
    import android.app.Activity;  
    import android.content.Context;  
    import android.opengl.GLSurfaceView;  
    import android.os.Bundle;  
    import android.view.MotionEvent;  
      
    public class ClearActivity extends Activity {  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            mGLView = new ClearGLSurfaceView(this);  
            setContentView(mGLView);  
        }  
      
        @Override  
        protected void onPause() {  
            super.onPause();  
            mGLView.onPause();  
        }  
      
        @Override  
        protected void onResume() {  
            super.onResume();  
            mGLView.onResume();  
        }  
      
        private GLSurfaceView mGLView;  
    }  
      
    class ClearGLSurfaceView extends GLSurfaceView {  
      
        public ClearGLSurfaceView(Context context) {  
            super(context);  
            mRenderer = new ClearRenderer();  
            setRenderer(mRenderer);  
        }  
      
        public boolean onTouchEvent(final MotionEvent event) {  
            queueEvent(new Runnable(){  
                public void run() {  
                    mRenderer.setColor(event.getX() / getWidth(),  
                            event.getY() / getHeight(), 1.0f);  
                }});  
      
                return true;  
            }  
      
            ClearRenderer mRenderer;  
    }  
       
      
    class ClearRenderer implements GLSurfaceView.Renderer {  
      
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
            // Do nothing special.  
        }  
      
        public void onSurfaceChanged(GL10 gl, int w, int h) {  
            gl.glViewport(0, 0, w, h);  
        }  
      
        public void onDrawFrame(GL10 gl) {  
            gl.glClearColor(mRed, mGreen, mBlue, 1.0f);  
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
        }  
      
       
        public void setColor(float r, float g, float b) {  
            mRed = r;  
            mGreen = g;  
            mBlue = b;  
        }  
      
        private float mRed;  
        private float mGreen;  
        private float mBlue;  
    }  

这个应用每帧都在清楚屏幕。当你点击屏幕时,它清除颜色基于你触屏时间的X、Y坐标。注意在 ClearGLSurfaceView.onTouchEvent()中使用queueEvent()。queueEvent()方法被安全地用于在UI线程和渲染线程之间进行交流。如果你愿意,你还可以使用一些其他的java线程间交流技术,例如Renderer 类本身的同步方法。然而,queueing 事件经常是一种用于处理线程间信息交流的更简单方式。

发布了79 篇原创文章 · 获赞 87 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u010281924/article/details/105752638