Android uygulamanızda OpenGL ES ile grafik çizmek üzere bu grafiklere ilişkin bir görünüm kapsayıcısı oluşturmanız gerekir. Bunu yapmanın en kolay yollarından biri hem GLSurfaceView
hem de GLSurfaceView.Renderer
uygulamaktır. GLSurfaceView
, OpenGL ile çizilen grafikler için bir görünüm kapsayıcısıdır ve GLSurfaceView.Renderer
bu görünüm içinde çizilenleri kontrol eder. Bu sınıflar hakkında daha fazla bilgi için OpenGL ES geliştirici kılavuzuna bakın.
GLSurfaceView
, uygulamanıza OpenGL ES grafiklerini eklemenin yollarından biridir. Tam ekran veya neredeyse tam ekran grafik görünümü için makul bir seçimdir.
OpenGL ES grafiklerini düzenlerinin küçük bir kısmına eklemek isteyen geliştiriciler TextureView
ürününe göz atmalıdır. Gerçek, "kendin yap" geliştiricileri için SurfaceView
kullanarak bir OpenGL ES görünümü oluşturmak da mümkündür. Ancak bu, oldukça fazla ek kod yazılmasını gerektirir.
Bu derste, basit bir uygulama etkinliğinde GLSurfaceView
ve GLSurfaceView.Renderer
öğelerinin minimum düzeyde uygulanmasını nasıl tamamlayacağınız açıklanmaktadır.
Manifest'te OpenGL ES kullanımını bildirme
Uygulamanızın OpenGL ES 2.0 API'yi kullanabilmesi için aşağıdaki beyanı manifest dosyanıza eklemeniz gerekir:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
Uygulamanız doku sıkıştırma kullanıyorsa yalnızca uyumlu cihazlara yüklenmesi için hangi sıkıştırma biçimlerini desteklediğini de belirtmeniz gerekir.
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
Doku sıkıştırma biçimleri hakkında daha fazla bilgi için OpenGL geliştirici kılavuzuna bakın.
OpenGL ES grafikleri için etkinlik oluşturma
OpenGL ES kullanan Android uygulamalarının etkinlikleri, kullanıcı arayüzüne sahip diğer tüm uygulamalar gibi etkinliklere sahiptir. Diğer uygulamalardan en önemli farkı, etkinliğinizin düzenine ne yerleştirdiğinizdir. Birçok uygulamada TextView
, Button
ve ListView
kullanabilseniz de OpenGL ES kullanan bir uygulamada da GLSurfaceView
ekleyebilirsiniz.
Aşağıdaki kod örneğinde, birincil görünüm olarak GLSurfaceView
kullanan bir etkinliğin minimum düzeyde uygulanması gösterilmektedir:
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); } }
Not: OpenGL ES 2.0, Android 2.2 (API Düzeyi 8) veya sonraki bir sürümü gerektirir. Bu nedenle Android projenizin bu API veya üstünü hedeflediğinden emin olun.
GLSurfaceView nesnesi oluşturma
GLSurfaceView
, OpenGL ES grafikleri çizebileceğiniz özel bir görünümdür.
Tek başına pek bir şey yapmaz. Nesnelerin gerçek çizimi, bu görünümde ayarladığınız GLSurfaceView.Renderer
öğesi üzerinden kontrol edilir. Aslında bu nesnenin kodu çok ince olduğundan, nesneyi genişletmeyi atlamak ve sadece değiştirilmemiş bir GLSurfaceView
örneği oluşturmak cazip gelebilir. Ancak bunu yapmayın. Dokunma etkinliklerini yakalamak için bu sınıfı genişletmeniz gerekir. Bu konu, Dokunmatik etkinlikleri yanıtlama dersinde ele alınmıştır.
GLSurfaceView
için gerekli olan temel kod minimumdur. Bu nedenle, hızlı bir uygulama için kodu kullanan etkinlikte yalnızca bir iç sınıf oluşturmak yaygın olarak kullanılır:
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
uygulamanıza ek olarak isteğe bağlı bir diğer seçenek de oluşturma modunu, GLSurfaceView.RENDERMODE_WHEN_DIRTY
ayarını kullanarak yalnızca çizim verilerinizde değişiklik olduğunda görünümü çizecek şekilde ayarlamaktır:
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);
Bu ayar, requestRender()
çağırana kadar GLSurfaceView
karesinin yeniden çizilmesini engeller. Bu örnek uygulama için daha verimli olur.
Oluşturucu sınıfı oluşturma
GLSurfaceView.Renderer
sınıfının veya oluşturucunun OpenGL ES kullanan bir uygulama içinde uygulanması, işler ilginç olmaya başlar. Bu sınıf, ilişkilendirildiği GLSurfaceView
öğesinde nelerin çizileceğini kontrol eder. GLSurfaceView
üzerinde neyin nasıl ve nasıl çizileceğini anlamak için Android sistemi tarafından çağrılan oluşturucuda üç yöntem vardır:
onSurfaceCreated()
: Görünümün OpenGL ES ortamını ayarlamak için bir kez çağrılır.onDrawFrame()
: Görünümün her yeniden çizimi için çağrılır.onSurfaceChanged()
- Görünümün geometrisi değişirse (örneğin, cihazın ekran yönü değiştiğinde) çağrılır.
Burada, GLSurfaceView
içinde siyah bir arka plan çizmekten başka bir işlevi olmayan çok temel bir OpenGL ES oluşturucu uygulaması gösterilmektedir:
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); } }
Hepsi bu kadar! Yukarıdaki kod örnekleri, OpenGL kullanarak siyah ekran görüntüleyen basit bir Android uygulaması oluşturur. Bu kod pek ilginç bir şey yapmasa da, bu sınıfları oluşturarak OpenGL ile grafik öğeleri çizmeye başlamak için gereken temeli atmış oldunuz.
Not: OpengGL ES 2.0 API'lerini kullanırken bu yöntemlerde neden GL10
parametresi bulunduğunu merak ediyor olabilirsiniz.
Bu yöntem imzaları, Android çerçeve kodunu daha basit tutmak amacıyla 2.0 API'lerinde yalnızca yeniden kullanılır.
OpenGL ES API'lerine aşinaysanız artık uygulamanızda bir OpenGL ES ortamı ayarlayabilmeniz ve grafik çizmeye başlayabilmeniz gerekir. Ancak, OpenGL’yi kullanmaya başlarken biraz daha yardıma ihtiyacınız varsa birkaç ipucu için sonraki derslere geçebilirsiniz.