原文地址:http://android.xsoftlab.net/training/graphics/opengl/index.html

引言

Android framework层为创建绚丽的功能性UI提供了大量的标准工具。然而,如果想要以更多方式来控制屏幕的绘制,或者在三维图形中绘制,那么就需要使用其它工具了。Android framework所提供的OpenGL ES API为我们提供了一系列的工具,这些工具可以用来显示一些高端大气、天马行空的图形,只要你能想得到,那么它就可以做得到。此外,它还得益于很多设备所提供的GPU加速功能。

这节课会讨论OpenGL的开发基础:包括设置环境、绘制对象、移动绘制元素及响应触摸事件。

在接下来的示例代码中使用了OpenGL ES 2.0 API,该版本在当前的Android设备上推荐使用。有关更多OpenGL ES的版本信息,请参见OpenGL开发指南。

Note: 注意不要将OpenGL ES 1.x API与OpenGL ES 2.0 API相混淆!这两个版本的API之间不可交换使用,如果要使用的话,那么只有一个结果,就是悲剧。

构建OpenGL ES的相关环境

为了能在Android应用中使用OpenGL ES,必须给OpenGL ES要绘制的图形区域创建一个View容器。其中一种实现方法就是实现GLSurfaceView及GLSurfaceView.Renderer。其中GLSurfaceView是在OpenGL中绘制图形的View容器。GLSurfaceView.Renderer用于控制应该在刚才的View中绘制什么。有关更多这些类的信息,请参见OpenGL ES开发指南。

GLSurfaceView是将OpenGL ES整合到应用中的唯一途径。对于全屏或者接近全屏的图形View,GLSurfaceView是最合适的选择。开发者如果需要将OpenGL ES整合到一小块区域上,应该使用TextureView。除此之外还可以使用SurfaceView,不过这可能需要相当多的代码才能实现。

这节课将会展示以最省的代码来实现GLSurfaceView及GLSurfaceView.Renderer。

在清单文件中声明OpenGL ES的使用

为了可以使用OpenGL ES 2.0 API,需要在清单文件中添加如下声明:

<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" />

有关更多纹理压缩格式的相关信息,请参见OpenGL开发指南。

为OpenGL ES创建一个Activity

与普通的应用相同,OpenGL ES也同样需要用户界面。主要的不同在于普通的应用只需要将布局放入Activity就可以。在使用OpenGL ES的应用中,除了使用普通的TextView这类基本控件之外,还需要添加GLSurfaceView。

下面这段代码展示了使用GLSurfaceView的最基本实现:

public class OpenGLES20Activity extends Activity {private GLSurfaceView mGLView;@Overridepublic 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);}
}

Note: OpenGL ES 2.0需要在Android 2.2及以上的版本上才能运行,请确保应用程序的最低版本在此之上。

构建GLSurfaceView对象

GLSurfaceView是一块特殊的区域,它可以用户绘制OpenGL ES图形。它本身不需要做太多事情。实际上,图形的绘制是由GLSurfaceView.Renderer来控制的。事实上,你可能想要试着不去继承这个类,而是直接创建一个原生的GLSurfaceView实例,不要这么去做。你需要继承这个类来捕获触摸事件,相关信息在Responding to Touch Events课程中有涉及到。

本质上GLSurfaceView的代码是很少的,所以为了快速去实现它,常见的做法是在使用这个对象的Activity中创建一个内部类:

class MyGLSurfaceView extends GLSurfaceView {private final MyGLRenderer mRenderer;public MyGLSurfaceView(Context context){super(context);// Create an OpenGL ES 2.0 contextsetEGLContextClientVersion(2);mRenderer = new MyGLRenderer();// Set the Renderer for drawing on the GLSurfaceViewsetRenderer(mRenderer);}
}

对GLSurfaceView的其它附加选项就是设置其渲染模式:

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

这个选项阻止了GLSurfaceView框架的重新绘制,直到requestRender()方法被调用。这可以提高应用的效率。

构建渲染器类

类GLSurfaceView.Renderer是真正有意思的地方。这个类可以控制在GLSurfaceView上所绘制的事物。它内部有3个方法,这3个方法由Android系统调用,用于计算如何在GLSurfaceView上进行绘制:

  • onSurfaceCreated()在设置OpenGL ES环境的时候调用一次。
  • onDrawFrame() view的每次绘制都会调用。
  • onSurfaceChanged() 在view的结构发生改变的时候进行调用,比如设备的屏幕方向发生了变化。

下面是OpenGL ES渲染器的最基本实现,这里只是在GLSurfaceView简单绘制了一个黑色的背景:

public class MyGLRenderer implements GLSurfaceView.Renderer {public void onSurfaceCreated(GL10 unused, EGLConfig config) {// Set the background frame colorGLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);}public void onDrawFrame(GL10 unused) {// Redraw background colorGLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);}public void onSurfaceChanged(GL10 unused, int width, int height) {GLES20.glViewport(0, 0, width, height);}
}

上面就是要做的所有工作了。上面的代码使用OpenGL绘制了一个黑色的背景。虽然这些代码并没有做什么有意思的事情,但是通过创建这些类,你就可以为通过OpenGL绘制图形打下了基础。

Note: 你可能会怀疑,在使用OpengGL ES 2.0 API时,为什么这些方法都会有个名叫GL10的参数。这些在2.0 API中重复使用到的签名方法是为了保持Android framework的代码简便。

如果你对OpenGL ES API很熟悉,你现在就可以设置OpenGL ES的环境并着手绘制图形了。无论如何,如果你想获取更多有关OpenGL的入门帮助,可以查看下节上部分的一些小提示。

Android官方开发文档Training系列课程中文版:OpenGL绘图之环境配置相关推荐

  1. Android官方开发文档Training系列课程中文版:分享文件之配置文件共享

    原文地址:http://android.xsoftlab.net/training/secure-file-sharing/index.html 导言 APP经常需要给其它的APP提供一个或多个文件. ...

  2. Android官方开发文档Training系列课程中文版:目录

    原文地址 : http://android.xsoftlab.net/training/index.html 引言 在翻译了一篇安卓的官方文档之后,我觉得应该做一件事情,就是把安卓的整篇训练课程全部翻 ...

  3. Android官方开发文档Training系列课程中文版:创建自定义View之View的创建

    原文地址:http://android.xsoftlab.net/training/custom-views/index.html 引言 Android框架含有大量的View类,这些类用来显示各式各样 ...

  4. Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制

    原文地址:http://android.xsoftlab.net/training/graphics/opengl/draw.html 如果你还不清楚如何定义图形及坐标系统,请移步:Android官方 ...

  5. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建

    原文地址:http://android.xsoftlab.net/training/basics/fragments/index.html 导言 为了在Android中创建动态的多面板用户界面,你需要 ...

  6. Android官方开发文档Training系列课程中文版:构建第一款安卓应用之环境配置

    欢迎来到Android开发大家庭. 这一课将会教授你如何构建你的第一款安卓应用.你将会学习到如何创建一个安卓工程,并运行一个可调试的应用版本.你也将会学习一个基本的安卓应用设计,包括如何构建一个简单的 ...

  7. Android官方开发文档Training系列课程中文版:打印内容之图像打印

    原文地址:http://android.xsoftlab.net/training/printing/index.html 引言 Android用户会很频繁的浏览设备上的内容,但是有部分情况例外,当屏 ...

  8. Android官方开发文档Training系列课程中文版:添加ActionBar之设置ActionBar

    导言- 添加ActionBar 原文地址:http://android.xsoftlab.net/training/basics/actionbar/index.html ActionBar是很多重要 ...

  9. Android官方开发文档Training系列课程中文版:打印内容之HTML文档打印

    原文地址:http://android.xsoftlab.net/training/printing/html-docs.html 在Android中打印内容要比打印照片要复杂一些,它要求将文本与图像 ...

最新文章

  1. [How TO]-virtualbox下安装ubuntu14.04超详细
  2. JZOJ 5463. 【NOIP2017提高A组冲刺11.8】证书
  3. ap接口 php_2018年小米高级 PHP 工程师面试题(模拟考试卷)
  4. js 怎么使一个absolute覆盖在父类上面_JS基础-完美掌握继承知识点
  5. kafka入门(一)简介
  6. 深度学习——CNN、RNN、DNN汇总
  7. python入门基础知识实例-Python入门基础知识实例,
  8. python软件下载安装百度网盘-python实现简单的百度云自动下载
  9. [高光谱] Hyperspectral-Classification Pytorch 数据集的读取、划分、加载
  10. foobar2000实现用手机远程控制PC命令行版
  11. 太完整了!塞班java软件下载
  12. 计算机拓展名cad,CAD用到的各种文件格式有哪些
  13. 水系图一般在哪里找得到_进展 | 水系钾离子电池研究取得重要进展
  14. 华中师范大学计算机考研论坛,2020年华中师范大学计算机考研经验分享
  15. 用友业务单据生成凭证如何修改凭证金额
  16. 【2018将成为AGI元年】13名专家盘点2017最重要AI事件,预测AGI将取代AI
  17. php有个schost.exe_svchost.exe是什么
  18. Shell脚本——免交互
  19. 世界著名设计公司-网址介绍
  20. ElementUI 图标字体无法正常显示 本地CDN文件

热门文章

  1. 当卷烟厂也那么卷后……
  2. Dev C++,一个好玩的猜数字游戏
  3. 一句话输出没有结束符的字符串
  4. ARM的位置无关程序设计
  5. php解析xml数据格式,PHP解析xml格式数据工具类实例分享
  6. JS面向对象——class定义类、类的构造函数、实例方法、访问器方法、静态方法、继承、super、多态
  7. Mongoose 数据校验
  8. LeetCode MySQL 178. 分数排名(dense_rank连续排名)
  9. LeetCode MySQL 1077. 项目员工 III
  10. LeetCode 593. 有效的正方形(数学)