翻译自官方文档http://developer.android.com
为了在app里绘制图形,你必须创建一个容器。最直接的方式就是实现GLSurfaceView和GLSurfaceView.Render接口。GLSurfaceView是图形和OpenGL绘图的视图控制器而GLSurefaceView.Renderer控制在视图里绘图(理解为画笔)。想了解更多这些classes,点击OpenGL ES
GLSurfaceView 只是一种在app里包含OpenGL ES图形的方式,对于全屏或接近全屏的图形视图,他是一个合理的选择。开发者们如果想在layout的小部分里体现OpenGL ES图形,你应该看一下TextureView。说真的,程序猿自己动手,也可以构建一个OpenGL ES视图用SurfaceView,但是得写相当多得额外代码。
本课程介绍怎样实现用GLSurfaceView和GLSurfaceView.Renderer做一个简单的app
1. 在Manifests声明
为了能够使用OpenGL ES 2.0 API,必须添加如下声明。
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
如果app使用了纹理压缩,必须声明压缩格式,使其只在兼容设备安装。
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
关于更多纹理压缩的格式,可参考OpenGL
2.创建一个OpenGL ES图形Activity
public class OpenGLES20Activity extends Activity {
private GLSurfaceView mGLView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a GLSurfaceView instance and set it
// as the ContentView for this Activity.
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}
OpenGL ES 2.0 需要api 2.2以上
3.构建一个GLSuerfaceView
GLSurfaceView 是一个特殊的veiw, 你可以在其中画OpenGL ES 图形,它本身虽然没有太多代码实现,但你也别不实现它或者直接使用它,你实现它为了获得touch events,
class MyGLSurfaceView extends GLSurfaceView {
private final MyGLRenderer mRenderer;
public MyGLSurfaceView(Context context){
super(context);
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
mRenderer = new MyGLRenderer();
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(mRenderer);
}
}
还有一个可选的设置是,把渲染模式改为 GLSurfaceView.RENDERMODE_WHEN_DIRTY ,这样仅在你的数据有变化时重新进行渲染。
// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
除非你调用requestRender(),这个设置会阻止帧被重画,有些情况下这样效率更高。
4.构建一个Render
这是一个渲染类,它控制着与之关联的GLSuerfaceView在上面画什么东西,其中3个方法需要被重写:
onSurfaceCreated() - 调用一次以建立视图的OpenGL ES的环境。
onDrawFrame() - 被执行每个重绘。
onSurfaceChanged() - 视图改变时被调用,比如屏幕方向改变
一个非常简单的实例:
public class MyGLRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Set the background frame color
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
public void onDrawFrame(GL10 unused) {
// Redraw background color
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}
}
一切就是这么简单!上面的例子使用OpenGL 显示一个黑色背景的app。尽管此代码不能做任何事情很有意思,通过创建这些类,你已经奠定需要开始绘制用OpenGL图形元素的基础。
你可能想知道为什么这些方法都有一个GL10参数,当您使用的OpenGL ES2.0 API。这些方法签名只是重复使用为2.0 API来保持Android框架代码更简单。
如果你熟悉了OpenGL ES APIS,你应该能建立一个OpenGL ES 在app里绘图。如果你需要更多的了解,请看下一课