【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 ...
随机推荐
- [刷题]算法竞赛入门经典(第2版) 5-5/UVa10391 - Compound Words
题意:问在一个词典里,那些单词是复合词,即哪些单词是由两个单词拼出来的. 渣渣代码:(Accepted, 30ms) //UVa10391 - Compound Words #include<i ...
- mongodb新人扫盲
前言 数据库基本命令 集合(表)命令 增加数据 删除数据 更新数据 使用update()更新 使用save()命令实现upsert 自动更新信息 查询数据 mongoose的使用 前言 mongodb ...
- .Net程序员学用Oracle系列(26):PLSQL 之类型、变量和结构
1.类型 1.1.属性类型 1.2.记录类型 2.变量 2.1.变量类型 2.2.变量定义 2.3.变量赋值 3.结构 3.1.顺序结构 3.2.选择结构 3.3.循环结构 4.总结 1.类型 在&l ...
- 《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端
1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...
- 用app.net Core搞点多国语言网站
Asp.net Core 中文文档很少,你可以看英文的,不过英文的也是说的有点乱.这篇文章是干货. 1. 配置好你的WebApplication,使他可以支持国际化语言,修改文档Startup.cs ...
- 第十五章(附)分布式缓存-Memcached
一.概念 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能. 二.适用场合 1.分布式应用.由于 ...
- OpenStack(企业私有云)万里长征第二步——使用Fuel部署
一.前言 最近一直在使用DevStack来安装OpenStack,注意一直二字,部署了一遍又一遍,操作系统怕是安装了不下上百次,有时是为了验证新的方案,有时是安装出错,还有时是运行过程中出错.总之是碰 ...
- TCP/UDP客户端
Python 网络编程----模块socekt 在渗透测试的过程中,经常会遇到需要创建一个TCP客户端来连接服务器.发送垃圾数据.进行模糊测试活进行其他任务的情况. 简单的TCP客户端代码: #!/u ...
- 深入解析java String中getBytes()的编码问题
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6900536.html Java服务器后台在和Android端App通信时,遇到了两端关于用MD5加密同一包含 ...
- Unsupervised Learning and Text Mining of Emotion Terms Using R
Unsupervised learning refers to data science approaches that involve learning without a prior knowle ...