SurfaceView ve GLSurfaceView

Android uygulama çerçevesi kullanıcı arayüzü, Görüntü ile başlayan bir nesne hiyerarşisini temel alır. Tüm kullanıcı arayüzü öğeleri, bir dizi ölçüm ve bunları dikdörtgen bir alana sığdıran bir düzen sürecinden geçer. Ardından, tüm görünür görüntü nesneleri, uygulama ön plana getirildiğinde WindowManager tarafından ayarlanan bir yüzeyde oluşturulur. Uygulamanın kullanıcı arayüzü iş parçacığı, düzeni ve oluşturma işlemini kare başına bir arabelleğe yapar.

SurfaceView

SurfaceView, görünüm hiyerarşinize ek bir birleşik katman yerleştirmek için kullanabileceğiniz bir bileşendir. SurfaceView, diğer görünümlerle aynı düzen parametrelerini kullanır. Bu nedenle, diğer görünümler gibi değiştirilebilir ancak SurfaceView'ın içeriği şeffaftır.

GL bağlamı veya medya kod çözücü gibi harici bir arabellek kaynağıyla oluşturma işlemi yaptığınızda, arabellekleri ekranda görüntülemek için arabellek kaynağından kopyalamanız gerekir. SurfaceView'i kullanarak bunu yapabilirsiniz.

SurfaceView'ın görünüm bileşeni görünür olmak üzereyken çerçeve, SurfaceControl'dan SurfaceFlinger'dan yeni bir yüzey istemesini ister. Yüzey oluşturulduğunda veya yok edildiğinde geri çağırma almak için SurfaceHolder arayüzünü kullanın. Yeni oluşturulan yüzey varsayılan olarak uygulama kullanıcı arayüzü yüzeyinin arkasına yerleştirilir. Yeni yüzeyi en üstte olacak şekilde varsayılan Z sıralamasını geçersiz kılabilirsiniz.

SurfaceView ile oluşturma, Camera API veya OpenGL ES bağlamıyla oluşturma gibi ayrı bir yüzeye oluşturmanız gerektiğinde yararlıdır. SurfaceView ile oluşturma işlemi yaptığınızda SurfaceFlinger, arabellekleri doğrudan ekrana oluşturur. SurfaceView olmadan, arabellekleri ekran dışı bir yüzeyde birleştirmeniz gerekir. Bu yüzey daha sonra ekranda birleştirilir. Bu nedenle, SurfaceView ile oluşturma işlemi ekstra çalışmayı ortadan kaldırır. SurfaceView ile oluşturduktan sonra, etkinlik yaşam döngüsü ile koordinasyon sağlamak ve gerekirse görünümün boyutunda veya konumunda ayarlamalar yapmak için kullanıcı arayüzü iş parçacısını kullanın. Ardından Donanım Derleyici, uygulama kullanıcı arayüzünü ve diğer katmanları birleştirir.

Yeni yüzey, tüketicisi bir SurfaceFlinger katmanı olan bir BufferQueue'ın üretici tarafıdır. Yüzey, yüzey tarafından sağlanan tuval işlevleri, EGLSurface ekleme ve GLES ile yüzeyde çizim yapma veya yüzeyi yazacak bir medya kod çözücü yapılandırma gibi bir BufferQueue besleyebilecek herhangi bir mekanizmayla güncellenebilir.

SurfaceView ve etkinlik yaşam döngüsü

SurfaceView kullanırken yüzeyi ana kullanıcı arayüzü iş parçacığı dışında bir iş parçacığında oluşturun.

SurfaceView içeren bir etkinlik için iki ayrı ancak birbirine bağlı durum makinesi vardır:

  • Uygulama onCreate/onResume/onPause
  • Yüzey oluşturuldu/değiştirildi/yok edildi

Etkinlik başladığında geri aramalar şu sırayla yapılır:

  1. onCreate()
  2. onResume()
  3. surfaceCreated()
  4. surfaceChanged()

Geri düğmesini tıklarsanız:

  1. onPause()
  2. surfaceDestroyed() (yüzey kaybolmadan hemen önce çağrılır)

Ekranı döndürürseniz etkinlik parçalara ayrılır ve yeniden oluşturulur. Böylece döngünün tamamını görürsünüz. isFinishing() simgesini kontrol ederek hızlı bir yeniden başlatma olduğunu anlayabilirsiniz. Bir etkinliği surfaceCreated()'ten sonra olacak şekilde hızlı bir şekilde başlatmak/durdurmak mümkündür.onPause()

Ekranı kapatmak için güç düğmesine dokunursanız surfaceDestroyed() olmadan yalnızca onPause() gösterilir. Yüzey etkin kalır ve oluşturma işlemi devam edebilir. İstekte bulunmaya devam ederseniz koreograf etkinlikleri almaya devam edebilirsiniz. Farklı bir yönü zorunlu kılan bir kilit ekranınız varsa cihazın ekranı açıldığında etkinliğiniz yeniden başlatılabilir. Aksi takdirde, ekranda boşluk göründüğünde öncekiyle aynı yüzeyi görebilirsiniz.

Ekran karardığında ne olmasını istediğinize bağlı olarak, iş parçacığının ömrü yüzeye veya etkinliğe bağlanabilir. Konu, etkinlik başlatıldığında/durdurulduğunda veya yüzey oluşturulduğunda/yok edildiğinde başlatılabilir/durdurulabilir.

Etkinlik başlatıldığında/durdurulduğunda iş parçacığının başlatılması/durdurulması, uygulama yaşam döngüsü ile iyi çalışır. Oluşturucu iş parçacığı onResume()'te başlatılır ve onStop()'te durdurulur. Mesaj dizisini oluşturup yapılandırırken bazen yüzey zaten mevcuttur, bazen de yoktur (örneğin, ekran güç düğmesiyle açıldıktan sonra hâlâ etkindir). Mesaj dizisinde ilk kullanıma hazırlama işlemini gerçekleştirmeden önce yüzeyin oluşturulmasını beklemeniz gerekir. Yüzey yeniden oluşturulmazsa surfaceCreate() geri çağırma işlevi tekrar tetiklenmeyeceği için bu işlevde ilklendirme yapamazsınız. Bunun yerine, yüzey durumunu sorgulayın veya önbelleğe alın ve oluşturma iş parçacığına yönlendirin.

Yüzey oluşturma/silme işleminde iş parçacığının başlatılması/durdurulması, yüzey ve oluşturma aracı mantıksal olarak iç içe geçtiği için iyi çalışır. Mesaj dizisini yüzey oluşturulduktan sonra başlatırsınız. Bu sayede, mesaj dizisi arasındaki iletişimle ilgili bazı sorunlar önlenir ve yüzey oluşturulan/değiştirilen mesajlar yalnızca yönlendirilir. Ekran boş kaldığında oluşturmanın durmasını ve boşluk ortadan kalktığında devam etmesini sağlamak için Choreographer'a kare çizme geri çağırma işlevini çağırmayı durdurmasını söyleyin. onResume(), oluşturma iş parçacığı çalışıyorsa geri çağırmaları devam ettirir. Ancak kareler arasındaki geçen süreye göre animasyon oluşturursanız bir sonraki etkinliğin gelmesi için büyük bir boşluk olabilir. Bu sorunu, açık bir duraklatma/devam mesajı kullanarak çözebilirsiniz.

Hem iş parçacığının kullanım süresinin etkinliğe mi yoksa yüzeye mi bağlı olduğuyla ilgili her iki seçenek de oluşturma iş parçacığının nasıl yapılandırıldığına ve çalışıp çalışmadığına odaklanır. Bununla ilgili bir sorun da etkinlik sonlandırılırken (onStop() veya onSaveInstanceState() içinde) iş parçacığındaki durumu ayıklamadır. Bu gibi durumlarda, iş parçacığının ömrünü etkinliğe bağlamak en iyi sonucu verir. Bunun nedeni, oluşturma iş parçacığı birleştirildikten sonra oluşturulan iş parçacığının durumuna senkronizasyon primitifleri olmadan erişilebilmesidir.

GLSurfaceView

GLSurfaceView sınıfı, EGL bağlamlarını, iş parçacığı arası iletişimi ve etkinlik yaşam döngüsü ile etkileşimi yönetmek için yardımcı sınıflar sağlar. GLES'i kullanmak için GLSurfaceView kullanmanız gerekmez.

Örneğin, GLSurfaceView oluşturma için bir iş parçacığı oluşturur ve burada bir EGL bağlamı yapılandırır. Etkinlik duraklatıldığında durum otomatik olarak temizlenir. Çoğu uygulamanın, GLES'i GLSurfaceView ile kullanmak için EGL hakkında bilgi sahibi olması gerekmez.

Çoğu durumda GLSurfaceView, GLES ile çalışmayı kolaylaştırabilir. Bazı durumlarda bu durum soruna yol açabilir.