Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android官方開發文檔Training系列課程中文版:OpenGL繪圖之環境配置

Android官方開發文檔Training系列課程中文版:OpenGL繪圖之環境配置

編輯:關於Android編程

原文地址: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,需要在清單文件中添加如下聲明:

如果應用用到了紋理壓縮的功能,那麼還需要聲明應用所使用到的壓縮格式,這樣的話,應用只能被安裝在支持的設備上。


有關更多紋理壓縮格式的相關信息,請參見OpenGL開發指南。

為OpenGL ES創建一個Activity

與普通的應用相同,OpenGL ES也同樣需要用戶界面。主要的不同在於普通的應用只需要將布局放入Activity就可以。在使用OpenGL ES的應用中,除了使用普通的TextView這類基本控件之外,還需要添加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及以上的版本上才能運行,請確保應用程序的最低版本在此之上。

構建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 context
        setEGLContextClientVersion(2);
        mRenderer = new MyGLRenderer();
        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(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 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: 你可能會懷疑,在使用OpengGL ES 2.0 API時,為什麼這些方法都會有個名叫GL10的參數。這些在2.0 API中重復使用到的簽名方法是為了保持Android framework的代碼簡便。

如果你對OpenGL ES API很熟悉,你現在就可以設置OpenGL ES的環境並著手繪制圖形了。無論如何,如果你想獲取更多有關OpenGL的入門幫助,可以查看下節上部分的一些小提示。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved