Android'de bir animasyon başlatıldığında ekran, sorunsuz bir deneyim sağlamak için genellikle maksimum yenileme hızına çıkar. İlerleme çubukları ve ses görselleştiriciler gibi küçük animasyonlar için bu yüksek yenileme hızı gereksizdir ve yüksek güç tüketimine neden olur.
Android 15'ten itibaren, uyarlanabilir yenileme hızı (ARR) özelliği sayesinde etkinleştirilen cihazlar, yüksek yenileme hızının etkinliğini iki açıdan azaltabilir:
- Yeni platform kare hızı yönetimi optimizasyonlarıyla, uygulamalar varsayılan olarak daha düşük bir kare hızında oluşturulabilir ve yalnızca gerektiğinde yüksek kare hızına yükseltilebilir.
- Ekran yenileme hızı, takılma olmadan içerik oluşturma hızıyla dinamik olarak eşleşir.
Çoğu uygulama, herhangi bir değişiklik yapmadan ARR'den yararlanabilir. Ancak gerektiğinde varsayılan kare hızı davranışını da geçersiz kılabilirsiniz.
Bu sayfada aşağıdakiler açıklanmaktadır:
- Her bir görüntülemenin kare hızı nasıl belirlenir?
- ARR'nin kare hızının ne olarak ayarlanacağını belirlemeyle ilgili genel politika.
- Varsayılan kare hızı davranışını manuel olarak nasıl geçersiz kılabilirsiniz?
Görüntüleme oylama mekanizması
Android'in Görüntü sistemi, kullanıcı arayüzü hiyerarşisindeki her Görüntü'nün tercih ettiği kare hızını ifade edebilir. Bu tercihler toplanır ve her kare için nihai kare hızı belirlenmek üzere birleştirilir. Bu, her görüntülemenin bir kategori veya belirli bir oran olabilecek kare hızı özelliğine göre oy kullandığı bir oylama mekanizması aracılığıyla gerçekleştirilir. Görüntüleme sayısı genellikle çekildiğinde veya güncellendiğinde oylanır. Bu oylar, nihai kare hızını belirlemek için birleştirilir. Bu kare hızı daha sonra oluşturma ipucu olarak alt düzey katmana gönderilir.
Şu anda çoğu görüntüleme, varsayılan olarak genellikle 60 Hz olarak ayarlanan "Normal" kare hızına sahiptir. Daha yüksek kare hızları için tercihleri özelleştirmek üzere belirli API'leri kullanabilirsiniz. Sistem genellikle en yüksek kare hızını seçer. Bu API'leri kullanma hakkında daha fazla bilgi için Kart hızını veya kategorisini belirleme bölümüne bakın. Kare hızlarıyla ilgili genel politikalar Genel ARR politikası bölümünde açıklanmıştır.
Kare hızı kategorileri
View
sınıfında, oylamada kullanılabilecek farklı kare hızı kategorileri vardır. Her kategorinin açıklaması aşağıda verilmiştir:
REQUESTED_FRAME_RATE_CATEGORY_DEFAULT
: Bu değer, varsayılan davranışa dönecek şekilde ayarlanabilir. Bu durumda, bu Görünümün kare hızı için veri olmadığı anlaşılır.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE
: Görünüm, kare hızını açıkça etkilemez. Bu, Görüntüleme etkin olsa bile çerçeve hızı belirlenirken çerçevenin dikkate alınmayacağı anlamına gelir.REQUESTED_FRAME_RATE_CATEGORY_NORMAL
: Daha yüksek kare hızları gerektirmeyen veya yüksek akıcılıktan yararlanmayan animasyonlar için uygun bir orta kare hızını belirtir. Bu değer genellikle 60 Hz veya buna yakındır.REQUESTED_FRAME_RATE_CATEGORY_HIGH
: Yüksek kare hızı gerektiren animasyonlar için uygun bir kare hızını belirtir. Bu, akıcılığı artırabilir ancak güç kullanımını da artırabilir.
Görünüm oyları yalnızca yeniden çizim gerektiriyorsa kullanılır. Nihai kare hızı, en yüksek oy alan seçenekle belirlenir. Örneğin, tüm oylar "Normal" içinse "Normal" seçilir. Hem "Normal" hem de "Yüksek" oy verildiğinde "Yüksek" seçilir.
Kare hızı
Görüntüleme, kare hızı kategorilerine ek olarak 30, 60 veya 120 Hz gibi tercih edilen bir kare hızı da belirtebilir. Birden fazla kare hızı oyu verildiğinde nihai kare hızı aşağıdaki kurallara göre belirlenir:
- Birbirinin katları: Oylanan kare hızları birbirinin katlarıysa en yüksek değer seçilir. Örneğin, iki oy varsa (30 Hz ve 90 Hz) nihai kare hızı olarak 90 Hz seçilir.
- Birbirinin katı olmamalıdır:
- Oylardan herhangi biri 60 Hz'den yüksekse "Yüksek" oy olarak sayılır.
- Tüm oylar 60 Hz veya daha düşükse "Normal" oy olarak sayılır.
Ayrıca, hem kare hızı değerlerinin hem de kare hızı kategorilerinin bir kombinasyonu varsa nihai oluşturma hızı genellikle daha yüksek değere göre belirlenir. Örneğin, 60 Hz oy ve "Yüksek" oy veya 120 Hz oy ve "Normal" oy kombinasyonuyla oluşturma hızı genellikle 120 Hz olarak ayarlanır.
Bir uygulamadan gelen oylara ek olarak, aynı çerçevedeki farklı bileşenlerden alt düzey katmana gönderilen başka ipuçları da olabilir. Bunların çoğu, bildirim gölgesi, durum çubuğu, gezinme çubuğu gibi sistem kullanıcı arayüzü bileşenlerinden kaynaklanabilir. Nihai kare hızı değerleri, birden fazla bileşenden gelen oylara göre belirlenir.
Kare hızını veya kategoriyi ayarlama
Belirli durumlarda, bir görüntü için tercih ettiğiniz kare hızı olabilir. Örneğin, bir animasyon düzgün görünmüyorsa kare hızını artırmak için görüntüleme için tercih edilen kare hızını "Yüksek" olarak ayarlayabilirsiniz. Ayrıca, videoda yavaş veya statik bir animasyon varsa (genellikle 24 veya 30 Hz'de oynatılır) güç tüketimini azaltmak için animasyonu "Normal"den daha düşük bir hızda çalıştırmayı tercih edebilirsiniz.
Belirli bir Görünümün tercih edilen kare hızını veya kategorisini belirlemek için setRequestedFrameRate()
ve getRequestedFrameRate()
API'lerini kullanabilirsiniz.
Kotlin
// Set the preferred frame rate category to a View // set the frame rate category to NORMAL view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL // set the frame rate category to HIGH view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_HIGH // reset the frame rate category view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT // Set the preferred frame rate to a View // set the frame rate to 30 view.requestedFrameRate = 30f // set the frame rate to 60 view.requestedFrameRate = 60f // set the frame rate to 120 view.requestedFrameRate = 120f
Java
// Set the preferred frame rate category to a View // set the frame rate category to NORMAL view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL); // set the frame rate category to HIGH view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_HIGH); // reset the frame rate category view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT); // Set the preferred frame rate to a View // set the frame rate to 30 view.setRequestedFrameRate(30); // set the frame rate to 60 view.setRequestedFrameRate(60); // set the frame rate to 120 view.setRequestedFrameRate(120);
Örnek kullanım için TextureView
bölümüne bakın.
Genel ARR politikası
Önceki bölümde, her Görünüm'ün tercih edilen kare hızı "Normal" olarak ayarlandığından çoğu animasyonun varsayılan olarak 60 Hz'de gösterildiğini belirtmiştik. Ancak, daha akıcı animasyonlar sağlamak için kare hızının "Yüksek" olarak ayarlandığı durumlar da vardır.
Genel ARR politikası aşağıdaki gibidir:
- Dokunma artışı: Bir dokunma etkinliği (
MotionEvent.ACTION_DOWN
) algılandığında, dokunma bırakıldıktan sonra yenileme hızı, duyarlılığı korumak için bir süreliğine "Yüksek"e çıkarılır. - Kaydırma hareketleri: Kaydırma hareketleri farklı şekilde ele alınır. Kaydırma hızı yavaşladıkça yenileme hızı kademeli olarak azalır. Bu davranışla ilgili ayrıntıları Kaydırma iyileştirmesi bölümünde bulabilirsiniz.
- Uygulama başlatma ve pencere geçişleri: Sorunsuz bir görsel deneyim sağlamak için uygulama başlatma, pencere başlatma ve pencere geçişleri sırasında da yenileme hızı bir süreliğine artırılır.
- Animasyonlar: Hareket veya boyut değişiklikleri içeren animasyonlar, bir görünümün konumu veya boyutu değiştiğinde akıcılığı artırmak için otomatik olarak daha yüksek bir yenileme hızına sahip olur.
SurfaceView
veTextureView
:TextureView
veSurfaceView
için açıkça ayarlanan kare hızlarına uyulur ve bunlara göre uygulanır.
Dokunma desteğini etkinleştirme ve devre dışı bırakma
Dokunma geliştirme özelliğini Window
düzeyinde etkinleştirebilir ve/veya devre dışı bırakabilirsiniz. Varsayılan olarak, kullanıcı ekrana dokunup parmağını kaldırdığında oluşturma hızı bir süre boyunca artar. setFrameRateBoostOnTouchEnabled()
ve getFrameRateBoostOnTouchEnabled()
API'leri, belirli bir Window
öğesine dokunulduğunda oluşturma hızının artmasını engellemenize olanak tanır.
Kotlin
// disable touch boost on a Window window.isFrameRateBoostOnTouchEnabled = false // enable touch boost on a Window window.isFrameRateBoostOnTouchEnabled = true // check if touch boost is enabled on a Window val isTouchBoostEnabled = window.isFrameRateBoostOnTouchEnabled
Java
// disable touch boost on a Window window.setFrameRateBoostOnTouchEnabled(false) // enable touch boost on a Window window.setFrameRateBoostOnTouchEnabled(true) // check if touch boost is enabled on a Window window.getFrameRateBoostOnTouchEnabled()
Kaydırma iyileştirmesi
Kare hızını dinamik olarak optimize etmenin önemli kullanım alanlarından biri, kaydırma deneyimini iyileştirmektir. Birçok uygulama, kullanıcıların yeni içerikleri görüntülemek için yukarı kaydırmasına büyük önem verir. ARR kaydırma geliştirmesi, fırlatma hareketi yavaşladıkça yenileme hızını dinamik olarak ayarlayarak kare hızını kademeli olarak düşürür. Bu sayede, kaydırma işlemini sorunsuz bir şekilde sürdürürken daha verimli bir oluşturma işlemi gerçekleştirilir.
Bu iyileştirme, özellikle ScrollView
, ListView
ve GridView
gibi kaydırılabilir kullanıcı arayüzü bileşenleri için geçerlidir ve tüm özel uygulamalarda kullanılamayabilir.
ARR kaydırma özelliği RecyclerView
ve NestedScrollView
'te kullanılabilir. Bu özelliği uygulamanızda etkinleştirmek için AndroidX.recyclerview
ve AndroidX.core
'un en son sürümlerine geçin. Ayrıntılar için aşağıdaki tabloya bakın.
Kitaplık |
Sürüm |
|
1.4.0 |
|
1.15.0 |
Hız bilgilerini ayarlama
Özel bir kaydırılabilir bileşeniniz varsa ve kaydırma özelliğinden yararlanmak istiyorsanız kaydırma veya fırlatma işlemini düzgün bir şekilde gerçekleştirirken her karede setFrameContentVelocity()
işlevini çağırın. Örnek için aşağıdaki kod snippet'ine bakın:
Kotlin
// set the velocity to a View (1000 pixels/Second) view.frameContentVelocity = 1000f // get the velocity of a View val velocity = view.frameContentVelocity
Java
// set the velocity to a View view.setFrameContentVelocity(velocity); // get the velocity of a View final float velocity = view.getFrameContentVelocity()
Daha fazla örnek için RecyclerView
ve ScrollView
sayfalarına bakın. Hızı doğru şekilde ayarlamak için, gerekli bilgiler Scroller
veya OverScroller
'ten alınamıyorsa içerik hızını (saniye başına piksel) manuel olarak hesaplayın.
Kaydırma yapılabilir bileşenler olmayan Görünümlerde setFrameContentVelocity()
ve getFrameContentVelocity()
çağrılırsa hareket, geçerli politikaya göre otomatik olarak daha yüksek bir kare hızını tetiklediğinden bu çağrıların hiçbir etkisi olmayacağını unutmayın.
Hız bilgileri, oluşturma hızını ayarlamak için çok önemlidir. Örneğin, fırlatma hareketini düşünün. Başlangıçta fırlatma hızının yüksek olması, sorunsuz bir deneyim için daha yüksek bir oluşturma hızı gerektirebilir. Hareket ilerledikçe hız azalır ve oluşturma hızı düşürülür.
ARR'yi etkinleştirme ve devre dışı bırakma
Güç verimliliğini artırmak için ARR varsayılan olarak etkindir. Bu özelliği devre dışı bırakabilirsiniz ancak uygulama daha fazla güç tüketeceği için bu önerilmemektedir. Bu özelliği yalnızca kullanıcı deneyimini önemli ölçüde etkileyen sorunlarla karşılaşırsanız devre dışı bırakın.
ARR'yi etkinleştirmek veya devre dışı bırakmak için Window
'ta setFrameRatePowerSavingsBalanced()
API'yi veya styles.xml
dosyanız aracılığıyla isFrameRatePowerSavingsBalanced()
API'yi kullanın.
Aşağıdaki snippet'te, ARR'nin Window
üzerinde nasıl etkinleştirileceği veya devre dışı bırakılacağı gösterilmektedir:
Kotlin
// disable ARR on a Window window.isFrameRatePowerSavingsBalanced = false // enable ARR on a Window window.isFrameRatePowerSavingsBalanced = true // check if ARR is enabled on a Window val isAdaptiveRefreshRateEnabled = window.isFrameRatePowerSavingsBalanced
Java
// disable ARR on a Window window.setFrameRatePowerSavingsBalanced(false) // enable ARR on a Window window.setFrameRatePowerSavingsBalanced(true) // check if ARR is enabled on a Window window.isFrameRatePowerSavingsBalanced()
ARR'yi styles.xml
dosyası üzerinden devre dışı bırakmak için res/values/styles.xml
dosyanızdaki stilinize aşağıdaki öğeyi ekleyin:
<style name="frameRatePowerSavingsBalancedDisabled">
<item name="android:windowIsFrameRatePowerSavingsBalanced">false</item>
</style>