Android官方开发文档Training系列课程中文版:OpenGL绘图之环境配置
原文地址:http://android.xsoftlab.net/training/graphics/opengl/index.html
引言
Android framework層為創(chuàng)建絢麗的功能性UI提供了大量的標(biāo)準(zhǔn)工具。然而,如果想要以更多方式來(lái)控制屏幕的繪制,或者在三維圖形中繪制,那么就需要使用其它工具了。Android framework所提供的OpenGL ES API為我們提供了一系列的工具,這些工具可以用來(lái)顯示一些高端大氣、天馬行空的圖形,只要你能想得到,那么它就可以做得到。此外,它還得益于很多設(shè)備所提供的GPU加速功能。
這節(jié)課會(huì)討論OpenGL的開發(fā)基礎(chǔ):包括設(shè)置環(huán)境、繪制對(duì)象、移動(dòng)繪制元素及響應(yīng)觸摸事件。
在接下來(lái)的示例代碼中使用了OpenGL ES 2.0 API,該版本在當(dāng)前的Android設(shè)備上推薦使用。有關(guān)更多OpenGL ES的版本信息,請(qǐng)參見(jiàn)OpenGL開發(fā)指南。
Note: 注意不要將OpenGL ES 1.x API與OpenGL ES 2.0 API相混淆!這兩個(gè)版本的API之間不可交換使用,如果要使用的話,那么只有一個(gè)結(jié)果,就是悲劇。
構(gòu)建OpenGL ES的相關(guān)環(huán)境
為了能在Android應(yīng)用中使用OpenGL ES,必須給OpenGL ES要繪制的圖形區(qū)域創(chuàng)建一個(gè)View容器。其中一種實(shí)現(xiàn)方法就是實(shí)現(xiàn)GLSurfaceView及GLSurfaceView.Renderer。其中GLSurfaceView是在OpenGL中繪制圖形的View容器。GLSurfaceView.Renderer用于控制應(yīng)該在剛才的View中繪制什么。有關(guān)更多這些類的信息,請(qǐng)參見(jiàn)OpenGL ES開發(fā)指南。
GLSurfaceView是將OpenGL ES整合到應(yīng)用中的唯一途徑。對(duì)于全屏或者接近全屏的圖形View,GLSurfaceView是最合適的選擇。開發(fā)者如果需要將OpenGL ES整合到一小塊區(qū)域上,應(yīng)該使用TextureView。除此之外還可以使用SurfaceView,不過(guò)這可能需要相當(dāng)多的代碼才能實(shí)現(xiàn)。
這節(jié)課將會(huì)展示以最省的代碼來(lái)實(shí)現(xiàn)GLSurfaceView及GLSurfaceView.Renderer。
在清單文件中聲明OpenGL ES的使用
為了可以使用OpenGL ES 2.0 API,需要在清單文件中添加如下聲明:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />如果應(yīng)用用到了紋理壓縮的功能,那么還需要聲明應(yīng)用所使用到的壓縮格式,這樣的話,應(yīng)用只能被安裝在支持的設(shè)備上。
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />有關(guān)更多紋理壓縮格式的相關(guān)信息,請(qǐng)參見(jiàn)OpenGL開發(fā)指南。
為OpenGL ES創(chuàng)建一個(gè)Activity
與普通的應(yīng)用相同,OpenGL ES也同樣需要用戶界面。主要的不同在于普通的應(yīng)用只需要將布局放入Activity就可以。在使用OpenGL ES的應(yīng)用中,除了使用普通的TextView這類基本控件之外,還需要添加GLSurfaceView。
下面這段代碼展示了使用GLSurfaceView的最基本實(shí)現(xiàn):
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及以上的版本上才能運(yùn)行,請(qǐng)確保應(yīng)用程序的最低版本在此之上。
構(gòu)建GLSurfaceView對(duì)象
GLSurfaceView是一塊特殊的區(qū)域,它可以用戶繪制OpenGL ES圖形。它本身不需要做太多事情。實(shí)際上,圖形的繪制是由GLSurfaceView.Renderer來(lái)控制的。事實(shí)上,你可能想要試著不去繼承這個(gè)類,而是直接創(chuàng)建一個(gè)原生的GLSurfaceView實(shí)例,不要這么去做。你需要繼承這個(gè)類來(lái)捕獲觸摸事件,相關(guān)信息在Responding to Touch Events課程中有涉及到。
本質(zhì)上GLSurfaceView的代碼是很少的,所以為了快速去實(shí)現(xiàn)它,常見(jiàn)的做法是在使用這個(gè)對(duì)象的Activity中創(chuàng)建一個(gè)內(nèi)部類:
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);} }對(duì)GLSurfaceView的其它附加選項(xiàng)就是設(shè)置其渲染模式:
// Render the view only when there is a change in the drawing data setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);這個(gè)選項(xiàng)阻止了GLSurfaceView框架的重新繪制,直到requestRender()方法被調(diào)用。這可以提高應(yīng)用的效率。
構(gòu)建渲染器類
類GLSurfaceView.Renderer是真正有意思的地方。這個(gè)類可以控制在GLSurfaceView上所繪制的事物。它內(nèi)部有3個(gè)方法,這3個(gè)方法由Android系統(tǒng)調(diào)用,用于計(jì)算如何在GLSurfaceView上進(jìn)行繪制:
- onSurfaceCreated()在設(shè)置OpenGL ES環(huán)境的時(shí)候調(diào)用一次。
- onDrawFrame() view的每次繪制都會(huì)調(diào)用。
- onSurfaceChanged() 在view的結(jié)構(gòu)發(fā)生改變的時(shí)候進(jìn)行調(diào)用,比如設(shè)備的屏幕方向發(fā)生了變化。
下面是OpenGL ES渲染器的最基本實(shí)現(xiàn),這里只是在GLSurfaceView簡(jiǎn)單繪制了一個(gè)黑色的背景:
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繪制了一個(gè)黑色的背景。雖然這些代碼并沒(méi)有做什么有意思的事情,但是通過(guò)創(chuàng)建這些類,你就可以為通過(guò)OpenGL繪制圖形打下了基礎(chǔ)。
Note: 你可能會(huì)懷疑,在使用OpengGL ES 2.0 API時(shí),為什么這些方法都會(huì)有個(gè)名叫GL10的參數(shù)。這些在2.0 API中重復(fù)使用到的簽名方法是為了保持Android framework的代碼簡(jiǎn)便。
如果你對(duì)OpenGL ES API很熟悉,你現(xiàn)在就可以設(shè)置OpenGL ES的環(huán)境并著手繪制圖形了。無(wú)論如何,如果你想獲取更多有關(guān)OpenGL的入門幫助,可以查看下節(jié)上部分的一些小提示。
總結(jié)
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:OpenGL绘图之环境配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 完美世界2020编程题-救雅典娜 英雄
- 下一篇: 优化器