Android uygulama çerçevesi kullanıcı arayüzü, View ile başlayan bir nesne hiyerarşisine dayanır. Tüm kullanıcı arayüzü öğeleri, dikdörtgen bir alana sığdırmak için bir dizi ölçümden ve düzen işleminden geçer. Ardından çerçeve, uygulama ön plana getirildiğinde WindowManager tarafından ayarlanan bir yüzeyde tüm görünür görünüm nesnelerini oluşturur. Uygulamanın kullanıcı arayüzü iş parçacığı, düzeni gerçekleştirir ve kare başına bir arabelleğe oluşturur.
SurfaceView
SurfaceView, görünüm hiyerarşinize ek bir bileşik katman yerleştirmek için kullanabileceğiniz bir bileşendir. SurfaceView, diğer görünümlerle aynı düzen parametrelerini alır. Bu nedenle, diğer görünümler gibi işlenebilir ancak SurfaceView'in içeriği şeffaftır.
GL bağlamı veya medya kod çözücü gibi harici bir arabellek kaynağıyla oluşturma yaptığınızda, arabellekleri ekranda göstermek için arabellek kaynağındaki arabellekleri kopyalamanız gerekir. SurfaceView kullanarak bunu yapabilirsiniz.
SurfaceView'un görünüm bileşeni görünür hale gelmek üzereyken çerçeve, SurfaceControl'dan SurfaceFlinger'dan yeni bir yüzey istemesini ister. Yüzey oluşturulduğunda veya yok edildiğinde geri arama almak için SurfaceHolder arayüzünü kullanın. Çerçeve, yeni oluşturulan yüzeyi varsayılan olarak uygulama kullanıcı arayüzü yüzeyinin arkasına yerleştirir. Yeni yüzeyi en üste yerleştirmek için varsayılan Z sıralamasını geçersiz kılabilirsiniz.
SurfaceView ile oluşturma, ayrı bir yüzeyde oluşturmanız gereken durumlarda (ör. Camera API veya OpenGL ES bağlamı ile oluşturma) faydalıdır. SurfaceView ile oluşturma yaptığınızda SurfaceFlinger, arabellekleri doğrudan ekranda 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 iş yükünü ortadan kaldırır. SurfaceView ile oluşturduktan sonra, etkinlik yaşam döngüsüyle koordinasyon sağlamak ve gerekirse görünümün boyutunda veya konumunda ayarlamalar yapmak için kullanıcı arayüzü iş parçacığını kullanın. Ardından, donanım birleştirici, uygulama kullanıcı arayüzünü ve diğer katmanları karıştırır.
Yeni yüzey, tüketicisi bir SurfaceFlinger katmanı olan BufferQueue'nun üretici tarafıdır. Yüzeyi, BufferQueue'yu besleyebilen herhangi bir mekanizmayla güncelleyebilirsiniz. Örneğin, yüzey tarafından sağlanan Canvas işlevleri, EGLSurface ekleme ve GLES ile yüzeyde çizim yapma veya yüzeye yazmak için bir medya kod çözücüyü yapılandırma.
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ığından oluşturun.
SurfaceView içeren bir etkinlik için iki ayrı ancak birbirine bağımlı durum makinesi vardır:
- Uygulama
onCreate/onResume/onPause - Yüzey oluşturuldu/değiştirildi/kaldırıldı
Etkinlik başladığında geri çağırmaları şu sırayla alırsınız:
onCreate()onResume()surfaceCreated()surfaceChanged()
Geri'yi tıklarsanız:
onPause()surfaceDestroyed()(yüzey kaybolmadan hemen önce çağrılır)
Ekranı döndürürseniz etkinlik kaldırılıp yeniden oluşturulur ve tam döngü elde edilir. isFinishing() simgesine bakarak hızlı yeniden başlatma olup olmadığını anlayabilirsiniz. Bir etkinliği o kadar hızlı başlatıp durdurmak mümkündür ki surfaceCreated(), onPause()'den sonra gerçekleşir.
Ekranı karartmak için güç düğmesine dokunursanız surfaceDestroyed() olmadan yalnızca onPause() simgesini görürsünüz. Yüzey etkin kalır ve oluşturma işlemi devam edebilir. İstemeye devam ettiğiniz sürece Koreograf etkinlikleri almaya devam edebilirsiniz. Farklı bir yönlendirmeyi zorunlu kılan bir kilit ekranınız varsa cihazın ekranı açıldığında etkinliğiniz yeniden başlatılabilir. Aksi takdirde, ekranı karartmadan önceki yüzeyle aynı şekilde çıkabilirsiniz.
Ekran karardığında ne olmasını istediğinize bağlı olarak ileti dizisinin kullanım ömrü yüzeye veya etkinliğe bağlanabilir. İş parçacığı, etkinlik başlatıldığında/durdurulduğunda veya yüzey oluşturulduğunda/yok edildiğinde başlatılabilir/durdurulabilir.
İş parçacığının etkinlik başlatma/durdurma sırasında başlatılması/durdurulması, uygulamanın yaşam döngüsüyle iyi çalışır. Oluşturucu iş parçacığını onResume() içinde başlatır ve onStop() içinde durdurursunuz. İş parçacığı oluşturulup yapılandırılırken bazen yüzey zaten vardır, bazen ise yoktur (ör. ekran, güç düğmesiyle açılıp kapatıldıktan sonra hala aktiftir). İş parçacığında başlatmadan önce yüzeyin oluşturulmasını beklemeniz gerekir. Yüzey yeniden oluşturulmadıysa surfaceCreate() geri çağırmasında başlatma işlemi yapamazsınız. Bunun yerine, yüzey durumunu sorgulayın veya önbelleğe alın ve oluşturucu iş parçacığına iletin.
İş parçacığının yüzey oluşturma/yok etme işleminde başlatılması/durdurulması, yüzey ve oluşturucunun mantıksal olarak iç içe geçmiş olması nedeniyle iyi sonuç verir. Yüzey oluşturulduktan sonra ileti dizisini başlatırsınız. Bu sayede, ileti dizileri arası iletişimle ilgili bazı sorunlar önlenir ve oluşturulan/değiştirilen yüzey iletileri yönlendirilir. Ekran karardığında oluşturma işleminin durduğunu ve ekran kararması kalktığında devam ettiğini doğrulamak için Choreographer'a kare çizme geri çağırmasını çağırmayı durdurmasını söyleyin. onResume()
Oluşturucu iş parçacığı çalışıyorsa geri çağırmaları devam ettirir. Ancak kareler arasındaki geçen süreye göre animasyon yaparsanız bir sonraki etkinlik gelmeden önce büyük bir boşluk olabilir. Açık bir duraklatma/devam ettirme mesajı kullanmak bu sorunu çözebilir.
İster iş parçacığının kullanım ömrü Etkinlik'e ister yüzeye bağlı olsun, her iki seçenekte de oluşturucu iş parçacığının nasıl yapılandırıldığı ve yürütülüp yürütülmediği üzerinde durulur. İlgili bir sorun da etkinlik sonlandırıldığında (onStop() veya onSaveInstanceState()) iş parçacığından durumun çıkarılmasıdır. Bu gibi durumlarda, iş parçacığının kullanım ömrünü etkinliğe bağlamak en iyi çözümdür. Çünkü oluşturucu iş parçacığı birleştirildikten sonra oluşturulan iş parçacığının durumuna senkronizasyon temel öğeleri 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ız gerekmez.
Örneğin, GLSurfaceView oluşturma için bir iş parçacığı oluşturur ve orada 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 herhangi bir bilgiye ihtiyacı yoktur.
Çoğu durumda GLSurfaceView, GLES ile çalışmayı kolaylaştırabilir. Bazı durumlarda bu özellik engelleyici olabilir.