Um Grafiken mit OpenGL ES in Ihrer Android-App zu zeichnen, müssen Sie ein
Ansicht-Container für sie. Eine der unkomplizierteren Möglichkeiten besteht darin, sowohl ein
GLSurfaceView
und GLSurfaceView.Renderer
. A
GLSurfaceView
ist ein Ansichtscontainer für mit OpenGL und
Mit GLSurfaceView.Renderer
wird festgelegt, was in dieser Ansicht gezeichnet wird. Weitere Informationen
finden Sie in der OpenGL ES
Entwicklerleitfaden.
GLSurfaceView
ist nur eine Möglichkeit, wie du OpenGL ES-Grafiken in deinen
. Für eine Vollbild- oder Vollbildgrafikansicht ist dies eine vernünftige Wahl.
Entwickler, die OpenGL ES-Grafiken in einem kleinen Teil ihrer Layouts verwenden möchten, sollten
TextureView
ansehen. Für echte Do-it-yourself-Entwickler:
mit SurfaceView
eine OpenGL ES-Ansicht erstellen.
und viel zusätzlichen Code schreiben.
In dieser Lektion erfahren Sie, wie Sie eine minimale Implementierung von GLSurfaceView
und GLSurfaceView.Renderer
auf einfache Weise durchführen.
App-Aktivitäten.
OpenGL ES-Nutzung im Manifest deklarieren
Damit Ihre Anwendung die OpenGL ES 2.0 API verwenden kann, müssen Sie Folgendes hinzufügen: -Deklaration zu deinem Manifest hinzu:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
Wenn Ihre Anwendung die Texturkomprimierung verwendet, müssen Sie auch angeben, welche Komprimierungsformate die deine App unterstützt, sodass sie nur auf kompatiblen Geräten installiert wird.
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
Weitere Informationen zu Texturkomprimierungsformaten findest du in der OpenGL-Entwicklerleitfaden
Aktivität für OpenGL ES-Grafiken erstellen
Android-Apps, die OpenGL ES nutzen, haben dieselben Aktivitäten wie jede andere App,
eine Benutzeroberfläche. Der Hauptunterschied zu anderen Anwendungen besteht darin, was Sie in das Layout für Ihre
Aktivitäten. In vielen Anwendungen können Sie TextView
, Button
und ListView
verwenden. In einer App mit OpenGL ES können Sie
fügen Sie außerdem GLSurfaceView
hinzu.
Das folgende Codebeispiel zeigt eine minimale Implementierung einer Aktivität, bei der ein
GLSurfaceView
als primäre Ansicht:
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); } }
Hinweis:Für OpenGL ES 2.0 ist Android 2.2 (API-Level 8) oder höher erforderlich. Stellen Sie daher sicher, dass Ihr Android-Projekt auf diese oder eine höhere API ausgerichtet ist.
GLSurfaceView-Objekt erstellen
Ein GLSurfaceView
ist eine spezielle Ansicht, in der du OpenGL ES zeichnen kannst.
Grafiken.
Alleine kann es nicht viel tun. Das eigentliche Zeichnen der Objekte wird im
GLSurfaceView.Renderer
, die Sie für diese Ansicht festgelegt haben. Der Code für diese
so dünn ist, könnten Sie versucht sein, die Erweiterung zu überspringen und einfach ein unverändertes
GLSurfaceView
-Instanz, aber tu das nicht. Sie müssen diesen Kurs verlängern in
um Touch-Ereignisse zu erfassen. Dies wird im Abschnitt Auf Berührung reagieren
.
Der Code für GLSurfaceView
ist minimal.
Implementierung ist es üblich,
erstellen Sie einfach eine innere Klasse in der Aktivität, in der sie verwendet wird:
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); } }
Eine weitere optionale Ergänzung zu Ihrer GLSurfaceView
-Implementierung besteht darin,
Rendermodus so, dass die Ansicht nur dann gezeichnet wird, wenn sich Ihre Zeichnungsdaten mithilfe der Funktion
GLSurfaceView.RENDERMODE_WHEN_DIRTY
Einstellung:
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);
Diese Einstellung verhindert, dass der Frame GLSurfaceView
neu gezeichnet wird, bis Sie
Rufen Sie requestRender()
auf,
für diese Beispiel-App.
Renderer-Klasse erstellen
Die Implementierung der GLSurfaceView.Renderer
-Klasse oder des Renderers
in einer Anwendung, die OpenGL ES nutzt, wird es interessant. Dieser Kurs
Einstellungen
was auf die GLSurfaceView
gezogen wird, mit der es verknüpft ist. Es gibt
drei Methoden in einem Renderer, die vom Android-System aufgerufen werden, um herauszufinden,
So zeichnen Sie auf einem GLSurfaceView
:
onSurfaceCreated()
– Wird einmal aufgerufen, um die OpenGL ES-Umgebung der Ansicht einzurichten.onDrawFrame()
– für jede aufgerufen die Ansicht neu zu zeichnen.onSurfaceChanged()
– Angerufen, wenn ändert sich die Geometrie der Ansicht, beispielsweise wenn sich die Bildschirmausrichtung des Geräts ändert.
Hier sehen Sie eine sehr einfache Implementierung eines OpenGL ES-Renderers, der nichts weiter tut, als eine
schwarzer Hintergrund im 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); } }
Das ist schon alles! Mit den Codebeispielen oben wird eine einfache Android-App erstellt, die zeigt einen schwarzen Bildschirm mit OpenGL an. Dieser Code erfüllt zwar nichts Interessantes, Sie diese Kurse erstellt haben, haben Sie den Grundstein gelegt, den Sie benötigen, um mit dem Zeichnen von Grafikelementen OpenGL
Hinweis:Wenn Sie die OpengGL ES 2.0 APIs verwenden, fragen Sie sich vielleicht, warum diese Methoden den Parameter GL10
haben.
Diese Methodensignaturen werden einfach für die 2.0-APIs wiederverwendet, damit der Code des Android-Frameworks erhalten bleibt.
einfacher zu machen.
Wenn ihr mit den OpenGL ES-APIs vertraut seid, solltet ihr jetzt in der Lage sein, eine OpenGL ES-API einzurichten. und zeichnen Sie Grafiken. Wenn Sie jedoch etwas mehr Hilfe benötigen, mit OpenGL begonnen hat, finden Sie in den nächsten Lektionen ein paar weitere Hinweise.