Android uygulama çerçevesi kullanıcı arabirimi, View ile başlayan nesnelerin hiyerarşisini temel alır. Tüm UI öğeleri, bir dizi ölçümden ve bunları 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 ayarlanan bir yüzeye işlenir. Uygulamanın UI iş parçacığı, çerçeve başına bir arabelleğe yerleşim ve işleme gerçekleştirir.
Yüzey Görünümü
SurfaceView, görünüm hiyerarşinize ek bir bileşik katman gömmek için kullanabileceğiniz bir bileşendir. Bir SurfaceView, diğer görünümlerle aynı düzen parametrelerini alır, bu nedenle diğer herhangi bir görünüm gibi manipüle edilebilir, ancak SurfaceView'ın içeriği şeffaftır.
GL bağlamı veya medya kod çözücü gibi harici bir arabellek kaynağıyla oluşturduğunuzda, arabellekleri ekranda görüntülemek için arabellek kaynağından arabellekleri kopyalamanız gerekir. Bir 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 istemesini ister. Yüzey oluşturulduğunda veya yok edildiğinde geri aramaları almak için SurfaceHolder arabirimini kullanın. Varsayılan olarak, yeni oluşturulan yüzey, uygulama UI yüzeyinin arkasına yerleştirilir. Yeni yüzeyi üste koymak için varsayılan Z sıralamasını geçersiz kılabilirsiniz.
SurfaceView ile işleme, Camera API veya bir OpenGL ES bağlamıyla oluşturduğunuz gibi, ayrı bir yüzeye oluşturmanı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ışı bir yüzeye birleştirmeniz gerekir, bu daha sonra ekranda birleştirilir, böylece SurfaceView ile işleme, fazladan çalışmayı ortadan kaldırır. SurfaceView ile oluşturduktan sonra, etkinlik yaşam döngüsü ile 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 Hardware Composer, uygulama kullanıcı arabirimini ve diğer katmanları karıştırır.
Yeni yüzey, tüketicisi bir SurfaceFlinger katmanı olan bir BufferQueue'nun üretici tarafıdır. Yüzey tarafından sağlanan Canvas işlevleri, bir EGLSurface ekleme ve GLES ile yüzey üzerinde çizim yapma veya yüzeyi yazmak için bir medya kod çözücüyü yapılandırma gibi bir BufferQueue'yu besleyebilen herhangi bir mekanizma ile yüzeyi güncelleyebilirsiniz.
SurfaceView ve aktivite yaşam döngüsü
SurfaceView kullanırken, yüzeyi ana UI iş parçacığı dışında bir iş parçacığından işleyin.
SurfaceView ile bir aktivite için iki ayrı fakat birbirine bağlı durum makinesi vardır:
- Uygulama
onCreate
/onResume
/onPause
- Yüzey oluşturuldu/değiştirildi/yok edildi
Etkinlik başladığında, şu sırayla geri aramalar alırsınız:
-
onCreate()
-
onResume()
-
surfaceCreated()
-
surfaceChanged()
Geri tıklarsanız şunları elde edersiniz:
-
onPause()
-
surfaceDestroyed()
(yüzey kaybolmadan hemen önce çağrılır)
Ekranı döndürürseniz, aktivite yırtılır ve yeniden oluşturulur ve tam döngüyü alırsınız. isFinishing()
kontrol ederek 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, onPause()
surfaceDestroyed()
. Yüzey etkin kalır ve işleme devam edebilir. İstekte bulunmaya devam ederseniz Koreograf etkinlikleri almaya devam edebilirsiniz. Farklı bir yönlendirmeyi zorlayan bir kilit ekranınız varsa, cihaz boş bırakıldığında etkinliğiniz yeniden başlatılabilir. Aksi takdirde, eskisi gibi aynı yüzeyle ekran boşluğundan çıkabilirsiniz.
İpliğin ömrü, ekran karardığında ne olmasını istediğinize bağlı olarak yüzeye veya etkinliğe bağlanabilir. İş parçacığı, Etkinlik başlat/durdur veya yüzey oluşturma/yok etme üzerinde başlayabilir/durabilir.
Aktivite başlat/durdur üzerinde iş parçacığı başlatma/durdurma, uygulama yaşam döngüsü ile iyi çalışır. Oluşturucu iş parçacığını onResume()
onStop()
. İş parçacığını oluştururken ve yapılandırırken, bazen yüzey zaten vardır, bazen yoktur (örneğin, ekranı güç düğmesiyle değiştirdikten sonra hala etkindir). İplikte başlatmadan önce yüzeyin oluşturulmasını beklemeniz gerekir. surfaceCreate()
geri çağrısında başlatamazsınız çünkü yüzey yeniden oluşturulmadıysa tekrar çalışmayacaktır. Bunun yerine, yüzey durumunu sorgulayın veya önbelleğe alın ve oluşturucu iş parçacığına iletin.
Yüzey oluşturma/yok etme üzerinde iş parçacığı başlatma/durdurma özelliği iyi çalışır çünkü yüzey ve oluşturucu mantıksal olarak iç içe geçmiştir. İpliği, yüzey oluşturulduktan sonra başlatırsınız, bu da bazı iplikler arası iletişim endişelerini ortadan kaldırır; ve yüzeyde oluşturulan/değiştirilen mesajlar basitçe iletilir. Ekran karardığında işlemenin durduğundan ve boşluk kaldırıldığında devam ettiğinden emin olmak için Koreografa çerçeve çekme geri çağrısını başlatmayı bırakmasını söyleyin. onResume()
, oluşturucu iş parçacığı çalışıyorsa geri aramaları sürdürür. Ancak, kareler arasında geçen süreye göre animasyon yaparsanız, bir sonraki olay gelmeden önce büyük bir boşluk olabilir; açık bir duraklatma/devam ettirme mesajı kullanmak bu sorunu çözebilir.
Her iki seçenek de, iş parçacığının ömrünün Aktiviteye mi yoksa yüzeye mi bağlı olduğu, 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, etkinlik öldürüldüğünde ( onStop()
veya onSaveInstanceState()
içinde) iş parçacığından durum çıkarmaktır; bu gibi durumlarda, iş parçacığının ömrünü etkinliğe bağlamak en iyi sonucu verir çünkü oluşturucu iş parçacığı birleştirildikten sonra, işlenen iş parçacığının durumuna senkronizasyon ilkelleri olmadan erişilebilir.
GLYüzey Görünümü
GLSurfaceView sınıfı, EGL bağlamlarını, iş parçacığı iletişimini 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 bir GLSurfaceView kullanmanıza gerek yoktur.
Örneğin, GLSurfaceView işleme 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 hiçbir şey bilmesine gerek yoktur.
Çoğu durumda GLSurfaceView, GLES ile çalışmayı kolaylaştırabilir. Bazı durumlarda araya girebilir.