如要在 Android 應用程式中使用 OpenGL ES 繪製圖形,您必須建立
檢視容器其中一種較為直接的方式
GLSurfaceView
和 GLSurfaceView.Renderer
。A 罩杯
GLSurfaceView
是使用 OpenGL 以及
GLSurfaceView.Renderer
可控制在此檢視畫面中繪製的內容。如要進一步瞭解
如要進一步瞭解這些類別,請參閱 OpenGL ES
開發人員指南
GLSurfaceView
只是將 OpenGL ES 圖形整合至您
應用程式。至於全螢幕或近乎全螢幕的圖像檢視,這是合理的選擇。
如果開發人員想要將 OpenGL ES 圖形納入一小部分的版面配置中,
請看一下 TextureView
。對真正的 DIY 開發人員而言
可以使用 SurfaceView
建立 OpenGL ES 檢視畫面,但這需要
撰寫許多額外的程式碼
本課程將說明如何以簡單明瞭的方式,完成 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 圖形建立活動
使用 OpenGL ES 的 Android 應用程式,其活動與具備其他
存取 API其他應用程式的主要差異在於
活動。在許多應用程式中,您可能會在使用 OpenGL ES 的應用程式內使用 TextView
、Button
和 ListView
,但您可以
並新增 GLSurfaceView
以下程式碼範例顯示使用
以 GLSurfaceView
做為主要檢視畫面:
Kotlin
class OpenGLES20Activity : Activity() { private lateinit var gLView: GLSurfaceView public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Create a GLSurfaceView instance and set it // as the ContentView for this Activity. gLView = MyGLSurfaceView(this) setContentView(gLView) } }
Java
public class OpenGLES20Activity extends Activity { private GLSurfaceView gLView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create a GLSurfaceView instance and set it // as the ContentView for this Activity. gLView = new MyGLSurfaceView(this); setContentView(gLView); } }
注意:OpenGL ES 2.0 需要 Android 2.2 (API 級別 8) 以上版本。 因此請確認您的 Android 專案指定該 API 或更高版本。
建構 GLSurfaceView 物件
GLSurfaceView
是特殊檢視區塊,可讓您繪製 OpenGL ES
圖像。
它本身不會造成太大影響。物件的實際繪圖是由
您針對這個資料檢視設定的 GLSurfaceView.Renderer
。事實上
您可能會想略過擴充方式
直接建立未經修改的
GLSurfaceView
執行個體,但進行這項操作。您需要在
擷取觸控事件,詳情請參閱「回應觸控式回應」一節
活動
GLSurfaceView
的基本程式碼非常精簡,
通常會使用
只要在使用該類別的活動中建立內部類別:
Kotlin
import android.content.Context import android.opengl.GLSurfaceView class MyGLSurfaceView(context: Context) : GLSurfaceView(context) { private val renderer: MyGLRenderer init { // Create an OpenGL ES 2.0 context setEGLContextClientVersion(2) renderer = MyGLRenderer() // Set the Renderer for drawing on the GLSurfaceView setRenderer(renderer) } }
Java
import android.content.Context; import android.opengl.GLSurfaceView; class MyGLSurfaceView extends GLSurfaceView { private final MyGLRenderer renderer; public MyGLSurfaceView(Context context){ super(context); // Create an OpenGL ES 2.0 context setEGLContextClientVersion(2); renderer = new MyGLRenderer(); // Set the Renderer for drawing on the GLSurfaceView setRenderer(renderer); } }
GLSurfaceView
實作項目還有另一個選用項目
只有在繪圖資料發生變更時,才會繪製檢視畫面
GLSurfaceView.RENDERMODE_WHEN_DIRTY
設定:
Kotlin
// Render the view only when there is a change in the drawing data renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
Java
// 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
中的黑色背景:
Kotlin
import javax.microedition.khronos.egl.EGLConfig import javax.microedition.khronos.opengles.GL10 import android.opengl.GLES20 import android.opengl.GLSurfaceView class MyGLRenderer : GLSurfaceView.Renderer { override fun onSurfaceCreated(unused: GL10, config: EGLConfig) { // Set the background frame color GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f) } override fun onDrawFrame(unused: GL10) { // Redraw background color GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT) } override fun onSurfaceChanged(unused: GL10, width: Int, height: Int) { GLES20.glViewport(0, 0, width, height) } }
Java
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLES20; import android.opengl.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); } }
就是這麼簡單!上述程式碼範例會建立簡單的 Android 應用程式, 會使用 OpenGL 顯示黑色畫面。雖然這個程式碼沒有有趣的部分 建立這些課程,您已打好基礎,開始繪製圖形元素時 OpenGL。
注意:當您使用 OpengGL ES 2.0 API 時,您可能會好奇這些方法為何含有 GL10
參數。
這些方法簽章會重複用於 2.0 API,以便保留 Android 架構程式碼
。
如果您熟悉 OpenGL ES API,您現在應該可以設定 OpenGL ES 即可開始繪製圖形。但如果您需要更多說明 開始使用 OpenGL,您可以在下一堂課程中學到更多提示。