Yanıtlar:
Görünümlerin tümü, tüm kullanıcı etkileşimi için de kullanılan aynı GUI iş parçacığında çizilir.
Dolayısıyla, GUI'yi hızlı bir şekilde güncellemeniz gerekiyorsa veya oluşturma işlemi çok fazla zaman alıyorsa ve kullanıcı deneyimini etkiliyorsa kullanın SurfaceView
.
Belirttiğim birkaç şey:
Daha fazla bilgi (ve harika bir kullanım örneği) için SDK'nın örnekler bölümündeki LunarLander projesine bakın.
güncellendi 05/09/2014
TAMAM. Şimdi resmi bir belgemiz var . Bahsettiğim her şeyi daha iyi konuştu.
Daha ayrıntılı bilgi için burayı okuyun .
Evet, ana fark surfaceView arka plan iş parçacığında güncellenebilir olmasıdır. Ancak, daha fazla umursabilirsiniz.
surfaceView ayırma yüzey arabelleğine sahipken, tüm görünüm ViewRoot tarafından ayrılan bir yüzey arabelleğini paylaşır. Başka bir deyişle, surfaceView daha fazla kaynağa mal olur.
surfaceView donanım hızlandırılamaz (JB4.2 itibariyle) normal Görünümdeki% 95 işlemler openGL ES kullanılarak HW hızlandırılır.
Özel yüzey görünümünüzü oluşturmak için daha fazla çalışma yapılmalıdır. SurfaceCreated / Destroy Event'i dinlemeniz, bir render iş parçacığı oluşturmanız, daha da önemlisi, render iş parçacığını ve ana iş parçacığını senkronize etmeniz gerekir. Ancak, Görünümü özelleştirmek için tek yapmanız gereken geçersiz kılmaktıronDraw
yöntemidir.
view.invalidate
UI iş parçacığını veya view.postInvalid
başka bir iş parçacığını ararsınız. Ancak, görünüm hemen güncellenmez, ancak bir sonraki VSYNC etkinliği gelene kadar bekleyin. VSYNC'yi anlamanın kolay yaklaşımı, her 60 saniyede bir 60 fps ekran için bir zamanlayıcı olarak düşünmektir. Android'de, tüm normal görünüm güncellemeleri (ve aslında görüntüleme ancak bugün konuşmayacağım), daha iyi pürüzsüzlük elde etmek için VSYNC ile senkronize edilir. Şimdi surfaceView'e geri döndüğünüzde, istediğiniz zaman oluşturabilirsiniz. Ancak, ekranın daha önce belirtildiği gibi VSYNC ile de senkronize olduğundan, bunun bir avantaj olup olmadığını anlayamıyorum.Temel fark SurfaceView
arka plan kalınlıklarıyla çizilebileceği, ancak Views
yapılamadığıdır.
SurfaceViews
daha fazla kaynak kullanın, böylece gerekmedikçe kullanmak istemezsiniz.
A SurfaceView
, Android'de içine çizmek için kullanılabilecek özel bir görünümdür.
A View
ve a arasındaki temel fark , tüm kullanıcı etkileşimi için kullanılan SurfaceView
bir Görünüm'ün çizilmesidir
UI Thread
.
Kullanıcı arayüzünü yeterince hızlı bir şekilde güncellemek ve içinde iyi miktarda bilgi oluşturmak istiyorsanız, SurfaceView daha iyi bir seçimdir.
Ancak, aşağıdakilerle ilgili birkaç teknik iç var SurfaceView
:
1. Donanım hızlandırması yapılmaz.
2. Eğer yöntemler aramak için normal görünümler oluşturulur invalidate
veya postInvalidate()
, ancak bu görünüm hemen güncellenecektir anlamına gelmez (A VSYNC
gönderilecektir ve güncellendiğinde OS karar verir. SurfaceView
Hemen güncellenebilir.
3. Bir SurfaceView vardır tahsis surface buffer
, bu yüzden daha pahalı
Yüzey görünümü ve görünüm arasındaki ana farklardan biri, ekranı normal bir görünüm için yenilemek için, görünümün tanımlandığı aynı iş parçacığından geçersiz kılma yöntemini çağırmamız gerektiğidir. Ancak geçersiz kılsa bile, canlandırma hemen gerçekleşmez. Sadece VSYNC sinyalinin bir sonraki gelişinden sonra ortaya çıkar. VSYNC sinyali, her 16,6 ms'de bir çekirdek tarafından üretilen bir sinyaldir veya bu saniyede 60 kare olarak da bilinir. Dolayısıyla, ekranın yenilenmesi üzerinde daha fazla kontrol istersek (örneğin, çok hızlı hareket eden animasyonlar için), normal görünüm sınıfını kullanmamalıyız.
Öte yandan, yüzey görünümü durumunda, ekranı istediğimiz kadar hızlı bir şekilde yenileyebilir ve bir arka plan iş parçacığından yapabiliriz. Dolayısıyla, yüzey görüntüsünün yenilenmesi gerçekten VSYNC'ye bağlı değildir ve yüksek hızlı animasyon yapmak istiyorsak bu çok yararlıdır. Tüm bunları güzel açıklayan birkaç eğitim videosu ve örnek uygulama var. Lütfen aşağıdaki eğitim videolarına bir göz atın.
Klasik View sınıfını değil neden SurfaceView kullanıyorsunuz?
Bunun temel nedenlerinden biri SurfaceView'in ekranı hızlı bir şekilde oluşturabilmesidir.
Basit bir deyişle, bir SV zamanlamayı yönetme ve animasyonları oluşturma konusunda daha yeteneklidir.
SurfaceView'un ne olduğunu daha iyi anlamak için onu View sınıfıyla karşılaştırmamız gerekir.
Fark nedir ... videodaki bu basit açıklamayı kontrol edin
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
Peki View ile büyük bir sorunumuz var .... animasyon oluşturma zamanlaması.
Normalde onDraw () işlevi Android çalışma zamanı sisteminden çağrılır.
Bu nedenle, Android çalışma zamanı sistemi onDraw () öğesini çağırdığında uygulama kontrol edemez
ekranın zamanlaması ve bu animasyon için önemlidir. Zamanlama boşluğumuz var
(oyunumuz) ve Android çalışma zamanı sistemi arasında.
Özel bir iş parçacığı tarafından onDraw () çağırabileceği SV.
Böylece: uygulama zamanlamayı kontrol eder. Böylece animasyonun bir sonraki bitmap görüntüsünü gösterebiliriz.