迎大家加入android技术交流QQ群:209796692)


建立OpenGL ES环境


为了能在你的Android应用中使用OpenGLES绘画,你必须创建一个view作为容器。而最直接的方式就是从GLSurfaceViewGLSurfaceView.Renderer分别派生一个类。GLSurfaceView作为OpenGL绘制所在的容器,而实际的绘图动作都是在GLSurfaceView.Renderer里面发生的。

使用GLSurfaceView几乎是整合OpenGLES到你的应用的唯一方式。对于一个全屏或近全屏的graphicsview,它是最好的选择。如果只是在某个小部分显示OpenGLES图形则可以考虑TextureView。当然如果你比较变态,你完全可以使用SurfaceView创建一个OpenGLES view

本教程演示如何完成一个最小实现的OpenGLES2.0应用。

Manifest中声明使用OpenGLES

为了能使用OpenGLES 2.0 API,你必须在你的manifest中添加以下声明:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

如果你的应用要使用纹理压缩功能,你必须还要声明设备需要支持什么样的压缩格式:

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /><supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

OpenGLES Graphics创建一个Activity

这个Activity与其它类型应用的Activity并无不同,要说不同,也仅仅是放到ActivitylayoutView不一样,你需要放入的是一个GLSurfaceView

下面的代码演示了使用GLSurfaceView作为主视图的Acitivity的最少代码实现:

public class OpenGLES20 extends Activity {    private GLSurfaceView mGLView;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //创建一个GLSurfaceView实例然后设置为activityContentView.        mGLView = new MyGLSurfaceView(this);        setContentView(mGLView);    }}

:OpenGL ES 2.0需要Android2.2 (API Level 8) 及以上版本。

构键一个GLSurfaceView对象

GLSurfaceView中其实不需要做太多工作,实际的绘制任务都在GLSurfaceView.Renderer中了。所以GLSurfaceView中的代码也非常少,你甚至可以直接使用GLSurfaceView,但是,然而,别这样做。因为你需要扩展这个类来响应触摸事件啊孩子。

扩展GLSurfaceView的类像这样写就可以了:

class MyGLSurfaceView extends GLSurfaceView {    public MyGLSurfaceView(Context context){        super(context);        //设置RendererGLSurfaceView        setRenderer(new MyRenderer());    }}

当使用OpenGLES 2.0时,你必须在GLSurfaceView构造器中调用另外一个函数,它说明了你将要使用2.0版的API

// 创建一个OpenGL ES 2.0 contextsetEGLContextClientVersion(2);

另一个可以添加的你的GLSurfaceView实现的可选的操作是设置render模式为只在绘制数据发生改变时才绘制view。使用GLSurfaceView.RENDERMODE_WHEN_DIRTY

// 只有在绘制数据改变时才绘制viewsetRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

此设置会阻止绘制GLSurfaceView的帧,直到你调用了requestRender(),这样会非常高效。

构建一个Renderer

此类控制向GLSurfaceView的绘制工作。它有三个方法被Android系统调用来计算在GLSurfaceView上画什么以及如何画。

  • onSurfaceCreated()- 仅调用一次,用于设置viewOpenGLES环境。

  • onDrawFrame()- 每次View被重绘时被调用。

  • onSurfaceChanged()- 如果view的几和形状发生变化了就调用,例如当竖屏变为横屏时。

下面是一个OpenGLES renderer的最基本的实现,它仅在GLSurfaceView画了一个灰色的背景:

public class MyGL20Renderer implements GLSurfaceView.Renderer {    public void onSurfaceCreated(GL10 unused, EGLConfig config) {        //设置背景的颜色        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);    }    public void onDrawFrame(GL10 unused) {        // 重绘背景色        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);    }    public void onSurfaceChanged(GL10 unused, int width, int height) {        GLES20.glViewport(0, 0, width, height);    }}

以上就是所有需要做的东西!上面的代码们创建了一个简单的Android应用,它使用OpenGL显示了一个灰色的屏幕。但这段代码并没有做什么有趣的事情,只是为使用OpenGL绘图做好了准备。

:你可以不明白为什么这些方法们都具有一个GL10参数,但你使用的却是OpengGLES 2.0 API们。这其实是为了使Android框架能简单的兼容各OpenGLES版本而做的。

如果你对OpenGLES API很熟悉,你其实现在已经可以开始进行绘图了。然而,如果你熟悉,就继续学习下一章吧。


下一讲

更多相关文章

  1. android 开发中判断网络是否连接的代码
  2. android设置横屏代码
  3. Android数据库代码备忘
  4. eclipse中查看Android SDK源代码
  5. Android获取运营商代码
  6. [小代码]在Android和PHP之间的加密/解密,AES加密
  7. android发生主机无法解析错误的问题(

随机推荐

  1. android 延时 不用另起线程或timertask
  2. Android用户界面开发(11):Menu
  3. Android错误解决方法大集合
  4. Android下拉刷新和上拉加载更多
  5. Android基础知识之API等级介绍
  6. 【android】ORMLite框架 的使用方法---给
  7. Android中有用的组件被选中和按下去的变
  8. Android解析XML文件的三种方式
  9. android rootfs
  10. Android通过RSA加密解密实现License