【Android Developers Training】 62. 搭建一个OpenGL ES环境
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/graphics/opengl/environment.html
要在你的应用中使用OpenGL ES绘制图像,你必须为它们创建一个视图容器。一个比较直接的方法是同时实现一个GLSurfaceView和一个GLSurfaceView.Renderer。GLSurfaceView是那些用OpenGL所绘制的图形的视图容器,而GLSurfaceView.Renderer则用来控制在该视图中绘制的内容。关于这两个类的更多信息,你可以阅读:OpenGL ES开发手册。
使用GLSurfaceView只是一种将你的应用与OpenGL ES合并起来的方法。对于一个全屏的或者接近全屏的图形视图,使用它是一个理想的选择。开发者如果希望把OpenGL ES的图形融合在布局的一小部门里面,那么可以考虑使用TextureView。对于自己动手开发的开发者来说(DIY),还可以通过使用SurfaceView来搭建一个OpenGL ES视图,但这将需要编写更多的代码。
在这节课中,我们将解释如何在一个简单地应用activity中完成GLSurfaceView和GLSurfaceView.Renderer的最小实现。
一). 在配置文件中声明使用OpenGL ES
为了让你的应用能够使用OpenGL ES 2.0接口,你必须将下列声明添加到配置文件当中:
<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。主要的区别就在于acitivity布局上的不同。在许多应用中你可能会使用TextView,Button和ListView,在使用OpenGL ES的应用中,你也需要添加一个GLSurfaceView。
下面的代码展示了使用一个GLSurfaceView的最小化实现。它作为主视图:
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);
}
}
Note:
OpenGL ES 2.0需要Android 2.2(API Level 8)或更高版本的系统,所以确保你的Android项目的API版本满足该要求。
三). 构建一个GLSurfaceView对象
一个GLSurfaceView是一个特定的视图,在视图中你可以绘制OpenGL ES图形。不过它自己所做的事情并不多。对于绘制对象的控制实际上是由你在该视图中配置的GLSurfaceView.Renderer所负责的。事实上,这个对象的代码非常简短,你可能会希望跳过继承它,并且只创建一个未经修改的GLSurfaceView实例,不过请不要这么做。你需要继承该类来捕捉触控事件,这方面知识在Responding to Touch Events(该系列课程的最后一节课)中会做进一步的介绍。
GLSurfaceView的核心代码是很小的,所以对于一个快速地实现,通常可以在acitvity中创建一个内部类并使用它:
class MyGLSurfaceView extends GLSurfaceView {
public MyGLSurfaceView(Context context){
super(context);
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(new MyRenderer());
}
}
当使用OpenGL ES 2.0时,你必须对你的GLSurfaceView构造函数添加另一个调用,以此来指明你希望使用的是2.0版本的接口:
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
Note:
如果你在使用OpenGL ES 2.0版本的接口,确保在你的应用配置文件中也进行了相关声明。这在之前的章节中已经讨论过了。
另一个对于GLSurfaceView实现的可选选项,是将渲染模式设置为:GLSurfaceView.RENDERMODE_WHEN_DIRTY,其含义是:仅在你的绘画数据发生变化时才在视图中进行绘画操作:
// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
这一配置将防止GLSurfaceView框架被重新绘制,直到你调用了requestRender(),这将让应用的性能及效率得到提高。
四). 构建一个渲染类
GLSurfaceView.Renderer类的实现,或者说在一个应用中使用OpenGL ES来进行渲染,正是事情变得有趣的地方。该类会控制和其相关联的GLSurfaceView,决定在上面画什么。一共有三个渲染器的方法被Android系统调用,以此来明确要在GLSurfaceView上画什么以及如何画:
- onSurfaceCreated() - 调用一次,用来配置视图的OpenGL ES环境。
- onDrawFrame() - 每次重画视图时被调用。
- onSurfaceChanged() - 如果视图的几何形态发生变化时会被调用,例如当设备的屏幕方向发生改变时。
下面是一个非常基本的OpenGL ES渲染器的实现,作用仅仅是在GLSurfaceView中画一个灰色的背景:
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显示一个灰色的屏幕。虽然它的代码做的事情并不怎么有趣,但是通过创建这些类,你已经为使用OpenGL绘制图形有了基本的认识和铺垫。
Note:
你可能想知道为什么这些方法有一个GL10的参数,在你明明使用的是OpenGL ES 2.0的接口的时候。这是因为这些方法在2.0接口中被简单地重用了,以此来保持Android框架尽量简单。
如果你对OpenGL ES接口很熟悉,那么你现在就可以在你的应用中部署一个OpenGL ES的环境并绘制图形。然而, 如果你希望获取更多的帮助来学会使用OpenGL,那么请继续学习下一节课程获取更多的知识。
【Android Developers Training】 62. 搭建一个OpenGL ES环境的更多相关文章
- 【Android Developers Training】 61. 序言:使用OpenGL ES显示图像
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android 中建立一个OpenGL ES的开发环境
转自: http://wiki.eoe.cn/page/Building_an_OpenGL_ES_Environment.html 负责人:zhangql原文链接:http://docs.eoean ...
- Android OpenGL ES 开发(二): OpenGL ES 环境搭建
零:环境搭建目的 为了在Android应用程序中使用OpenGL ES绘制图形,必须要为他们创建一个视图容器.其中最直接或者最常用的方式就是实现一个GLSurfaceView和一个GLSurfaceV ...
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 3. 构建一个简单UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 1. 创建一个Android项目工程
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 105. 显示一个位置地址
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 96. 运行一个同步适配器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 95. 创建一个同步适配器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- JPA - hibernate 的各种常见用法
近期在做的项目使用的JPA,所以在此跟大家分享一下JPA的一些常见使用方法. JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的 ...
- 使用cmd来起一个服务器
第一步:安装Node.js 下载地址:https://nodejs.org/en/ 第二步:打开cmd,输入node -v 确认是否安装成功,成功后显示版本号如下: 第三步:输入命令:ndoe ins ...
- Struts2 控制文件上传下载
之前介绍servlet3.0新特性的时候有提到过servlet API提供了一个part类来实现对文件的上传和保存,Struts其实是在其基础上做了进一步的封装,更加简单易用.至于文件下载,Strut ...
- PC端网页的基本构成
首先,一个前端最基本的就是排网页,有人会看不起拍页面,认为不就是排一个页面嘛,有啥的,分分钟的事,可是他不知道的是,一个网页中也包含了很多内容,像我们如果不理解margin,padding,会经常对我 ...
- 走进javascript——数组的那些事
Array构造器 如果参数只有一个并且是Number类型,那么就是指定数组的长度,但不能是NaN,如果是多个会被当做参数列表. new Array(12) // (12) [undefined × 1 ...
- 教育类APP开发现新增长,多款APP该如何突围?
"十二五"以来,国家共出台相关的重大教育政策文件741个,而进入到"十三五"时期教育领域综合改革深入推进的关键期,不断促进教育现代化的实现.加快迈入人力资源强国 ...
- 卫星导航低噪声放大器芯片(LNA)-AT2659
AT2659 是一款专门针对中国 BDS(北斗卫星导航系统),美国的 GPS,俄罗斯的 GLONASS 和欧盟的 GALILEO 导航系统应用而设计的高增益.低噪声系数射频放大器. AT2659 芯 ...
- 学习python的第一个小目标:通过requests+xlrd实现简单接口测试,将测试用例维护在表格中,与脚本分开。
小白的学习方式:通过确定一个小目标来想办法实现它,再通过笔记来加深印象. 面对标题中的小目标我陷入了思考....嗯,首先实现利用xlrd库来取出想要的用例 首先用表格准备好用例,如图下: 先试下取nu ...
- Python有哪些好用的语言翻译方法
最近有个需求,要将几万条数据从日语翻译成中文.因为数据的获取和处理用的是python代码,所以想先尝试翻译部分也用python实现. 目前网上查到的翻译方法有百度.有道云以及谷歌翻译,下面会对这三个方 ...
- 百度导航试用 vs 高德导航
听说百度导航免费了,下载试用了一下: HUD模式不错,但是需要一个手机支架或挂钩.尤其是HUD景象模式,夜间把手机平放,通过前挡风玻璃反射看.这个功能有点乔布斯的感觉了. 不过路径规划还差一点,和凯立 ...