Android GLSurfaceView

来源:互联网 发布:c语言编程代码 编辑:程序博客网 时间:2024/05/16 19:47

GLSurfaceView

一个实现SurfaceView,专注显示OpenGL表现的类.如果想要捕获屏幕点击事件,就应该继承这个类并且实现事件监听.

一个GLSurfaceView,具有以下特点:

1.管理一个平面,这个平面是一个特殊的内存块,它可以和android视图系统混合.

2.管理一个EGL显示,它能够让OpenGL渲染到一个平面.

3.接受一个用户提供的实际显示的Renderer对象.

4.使用一个专用线程去渲染从而和UI线程解耦.

5.支持on-demand  和连续的渲染.

6.可选的包,追踪 和/或者错误检查这个渲染器的OpenGL调用.

Using GLSurfaceView

GLSurfaceView代表性的使用是通过继承这个类,并且覆盖一个或者多个视图系统的输入事件方法.如果你的应用不需要覆盖事件方法,GLSurfaceView也可以正常被使用.

GLSurfaceView在很大程度上的行为是通过调用"set"方法来自定义,而不是通过继承.例如,不像一个常规的View,绘制(drawing)是委托给一个单独的(分离的)Renderer对象,它是通过调用setRenderer(Renderer)方法来注册的.

Initializing GLSurfaceView

对于初始化GLSurfaceView,必须要做的事情就是调用setRenderer(Renderer),但是如果有必要,你可以通过在调用setRenderer(Renderer)方法前调用一个或者多个方法去修改GLSurfaceView的默认的行为.

· setDebugFlags(int)

· setEGLConfigChooser(boolean)

· setEGLConfigChooser(EGLConfigChooser)

· setEGLConfigChooser(int, int, int, int, int, int)

· setGLWrapper(GLWrapper)

Specifying the android.view.Surface

默认的GLSurfaceView将创建一个 PixelFormat.RGB_565 格式的surface.如果需要一个透明的surface,调用getHolder().setFormat(PixelFormat.TRANSLUCENT).透明度的精确性依赖于设备,

Choosing an EGL Configuration

GLSurfaceView启动后第一件必须要做的事情就是,选择使用什么样的EGLConfit. 默认的GLSurfaceView选择的一个EGLConfig  是RGB_565 pixel 格式,最少有一个16位深度缓存区并且没有模版.

如果更想要一个不同的EGLConfig  你可以通过调用setEGLConfigChooser()  方法来覆盖默认的行为.

Debug Behavior

你可以选择性的修改GLSurfaceView  的行为通过调用一个或者多个调试方法setDebugFlags(int), and setGLWrapper(GLSurfaceView.GLWrapper) 

这些方法可能在setRenderer 方法之前或者之后调用,但一般而言都是在之前,以至于能立即生效.

Setting a Renderer

最后,一定要调用 setRenderer(GLSurfaceView.Renderer) 去注册一个, GLSurfaceView.Renderer. Renderer负责执行实际的OpenGL渲染.

Rendering Mode

一旦renderer被设置,你可以控制renderer绘画是连续的还是on-demand (按需)通过调用setRenderMode(int).  默认的是连续的.

Activity Life-cycle

一个GLSurfaceView  一定要注意,这个activitypaused  和resumed 两种状态.当这个activity处于pauses  状态时,GLSurfaceView  客户端需要去调用 onPause() 方法,activity处于resumed 状态时,GLSurfaceView  客户端也需要去调用 onResume() 方法.

Handling events(事件处理)

处理GLSurfaceView  的事件和处理其他任何View一样,都是覆盖适当的方法.但是,当处理事件时,你可能需要去和运行在rendering线程中的Renderer对象进行通讯.你可以使用java任何标准的进程通信机制来做这件事.另外,一个相对容易的和你的renderer  进行通信的方法是调用queueEvent(Runnable). 例如:

 class MyGLSurfaceView extends GLSurfaceView {
     private MyRenderer mMyRenderer;
     public void start() {
         mMyRenderer = ...;
         setRenderer(mMyRenderer);
     }
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
             queueEvent(new Runnable() {
                 // This method will be called on the rendering
                 // thread:
                 public void run() {
                     mMyRenderer.handleDpadCenter();
                 }});
             return true;
         }
         return super.onKeyDown(keyCode, event);
     }
 }

文章连接:http://blog.csdn.net/murongshusheng/article/details/7565771


原创粉丝点击