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 一定要注意,这个activity的paused 和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