SurfaceView ve GLSurfaceView

Android uygulama çerçevesi kullanıcı arayüzü, View ile başlayan nesnelerin hiyerarşisini temel alır. Tüm UI öğeleri bir dizi ölçümden ve onları dikdörtgen bir alana sığdıran bir yerleşim sürecinden geçer. Ardından tüm görünür görünüm nesneleri, uygulama ön plana getirildiğinde WindowManager tarafından oluşturulan bir yüzeye dönüştürülür. Uygulamanın kullanıcı arayüzü iş parçacığı, çerçeve başına bir ara belleğe düzen ve oluşturma gerçekleştirir.

Yüzey Görünümü

SurfaceView, görünüm hiyerarşinize ek bir bileşik katman eklemek için kullanabileceğiniz bir bileşendir. Bir SurfaceView, diğer görünümlerle aynı düzen parametrelerini alır, dolayısıyla 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 görüntü oluşturduğunuzda, arabellekleri ekranda görüntülemek için arabellekleri arabellek kaynağından kopyalamanız gerekir. SurfaceView kullanmak bunu yapmanızı sağlar.

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

SurfaceView ile işleme, Kamera API'si veya OpenGL ES bağlamı ile işleme yaptığınızda olduğu gibi, ayrı bir yüzeye işleme yapmanız gereken durumlarda faydalıdır. SurfaceView ile görüntü oluşturduğunuzda SurfaceFlinger doğrudan ekrana arabellekler oluşturur. SurfaceView olmadan, arabellekleri ekran dışındaki bir yüzeye birleştirmeniz gerekir; bu yüzey daha sonra ekrana birleştirilir; böylece SurfaceView ile görüntü oluşturma ekstra çalışmayı ortadan kaldırır. SurfaceView ile görüntü oluşturduktan sonra, etkinlik yaşam döngüsünü koordine etmek için UI iş parçacığını kullanın ve gerekirse görünümün boyutunda veya konumunda ayarlamalar yapın. Ardından Donanım Oluşturucu, uygulama kullanıcı arayüzünü ve diğer katmanları harmanlar.

Yeni yüzey, tüketicisi bir SurfaceFlinger katmanı olan BufferQueue'nun üretici tarafıdır. Yüzeyi, yüzey tarafından sağlanan Canvas işlevleri, bir EGLSurface eklemek ve GLES ile yüzey üzerinde çizim yapmak veya yüzeye yazmak için bir medya kod çözücüyü yapılandırmak gibi BufferQueue'yu besleyebilecek herhangi bir mekanizma ile güncelleyebilirsiniz.

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

SurfaceView kullanırken, ana UI iş parçacığından farklı bir iş parçacığından yüzeyi işleyin.

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

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

Etkinlik başladığında geri aramaları şu sırayla alırsınız:

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

Geri tıklarsanız şunları elde edersiniz:

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

Ekranı döndürürseniz etkinlik parçalanıp yeniden oluşturulur ve tam döngüyü elde edersiniz. isFinishing() öğesini kontrol ederek bunun hızlı bir yeniden başlatma olduğunu anlayabilirsiniz. Bir aktiviteyi o kadar hızlı başlatmak/durdurmak mümkündür ki, surfaceCreated() onPause() sonra gerçekleşir.

Ekranı boşaltmak için güç düğmesine dokunursanız, surfaceDestroyed() olmadan yalnızca onPause() elde edersiniz. Yüzey aktif kalır ve işleme devam edebilir. Talep etmeye devam ederseniz Koreograf etkinliklerini almaya devam edebilirsiniz. Farklı bir yönelime zorlayan bir kilit ekranınız varsa, cihazın ekranı kapatıldığında etkinliğiniz yeniden başlatılabilir. Aksi halde ekrandan eskisi gibi aynı yüzeyle çıkabilirsiniz.

İş parçacığının ömrü, ekran karardığında ne olmasını istediğinize bağlı olarak yüzeye veya etkinliğe bağlı olabilir. İş parçacığı, Etkinlik başlatma/durdurma veya yüzey oluşturma/yok etme işleminde başlatılabilir/durdurulabilir.

Etkinlik başlatma/durdurmada iş parçacığının başlatılması/durdurulması, uygulama yaşam döngüsüyle iyi çalışır. Oluşturucu iş parçacığını onResume() ile başlatır ve onStop() ile durdurursunuz. İş parçacığını oluştururken ve yapılandırırken, bazen yüzey zaten mevcuttur, bazen yoktur (örneğin, güç düğmesiyle ekranı değiştirdikten sonra hala etkindir). İş parçacığını başlatmadan önce yüzeyin oluşturulmasını beklemeniz gerekir. surfaceCreate() geri çağırma işlemini başlatamazsınız çünkü yüzey yeniden oluşturulmamışsa tekrar tetiklenmeyecektir. Bunun yerine, yüzey durumunu sorgulayın veya önbelleğe alın ve bunu oluşturucu iş parçacığına iletin.

İş parçacığının yüzey oluşturma/yok etme işleminde başlatılması/durdurulması iyi çalışır çünkü yüzey ve oluşturucu mantıksal olarak iç içe geçmiştir. İş parçacığını yüzey oluşturulduktan sonra başlatırsınız, bu da bazı iş parçacıkları arası iletişim sorunlarını ortadan kaldırır; ve yüzeyde oluşturulan/değiştirilen mesajlar basitçe iletilir. Ekran karardığında oluşturmanın durdurulmasını ve ekran boşaldığında devam etmesini sağlamak için Koreografa kare çizimi geri çağırmayı durdurmasını söyleyin. onResume() oluşturucu iş parçacığı çalışıyorsa geri aramaları sürdürür. Ancak kareler arasında geçen süreyi temel alarak animasyon yaparsanız bir sonraki olay gelmeden önce büyük bir boşluk oluşabilir; Açık bir duraklatma/devam ettirme mesajı kullanmak bu sorunu çözebilir.

İş parçacığının ömrünün Etkinliğe veya yüzeye bağlı olup olmadığına bakılmaksızın her iki seçenek de oluşturucu iş parçacığının nasıl yapılandırıldığına ve yürütülüp yürütülmediğine odaklanır. İlgili bir endişe, aktivite sonlandırıldığında ( onStop() veya onSaveInstanceState() içinde) iş parçacığından durumun çıkarılmasıdır; bu gibi durumlarda iş parçacığının ömrünü etkinliğe bağlamak en iyi sonucu verir çünkü işleyici iş parçacığı birleştirildikten sonra işlenen iş parçacığının durumuna senkronizasyon temelleri olmadan erişilebilir.

GLSurfaceView

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

Örneğin, GLSurfaceView, işleme için bir iş parçacığı oluşturur ve burada bir EGL bağlamını yapılandırır. Etkinlik duraklatıldığında durum otomatik olarak temizlenir. GLES'i GLSurfaceView ile kullanmak için çoğu uygulamanın EGL hakkında hiçbir şey bilmesine gerek yoktur.

Çoğu durumda GLSurfaceView, GLES ile çalışmayı kolaylaştırabilir. Bazı durumlarda yolunuza çıkabilir.