Tahmine dayalı geri animasyonlar için destek eklendi

Sisteme geri API'lerini kullanırken uygulama içi animasyonlar almayı ve özel geçişleri desteklemeyi etkinleştirebilirsiniz.

Video 1: Tahmini geri animasyonları

Bu özelliği etkinleştirdikten sonra uygulamanızda ana sayfaya geri gitme, etkinlikler arası geçiş ve görevler arası geçiş animasyonları gösterilir.

Ayrıca, aşağıdaki gibi materyal bileşen animasyonlarını almak için materyal bileşen bağımlılığınızı MDC Android'in 1.10.0 sürümüne yükseltebilirsiniz:

Daha fazla bilgi için GitHub'daki Material bileşen geliştirici kılavuzuna bakın.

Videoda, Android Ayarlar uygulamasını kullanarak etkinlikler arası geçiş yapma ve ana sayfaya geri gitme için tahmin edilen geri gitme animasyonlarının kısa bir örneği gösteriliyor.

  1. Animasyonda, kullanıcı önceki ayarlar ekranına dönmek için geri kaydırıyor. Bu, etkinlikler arası animasyon örneğidir.
  2. Şimdi önceki ekranda kullanıcı, ikinci kez geri kaydırmaya başlıyor ve ana ekranın duvar kağıdıyla birlikte önizlemesini gösteriyor. Bu, ana ekrana geri dönme animasyonunun bir örneğidir.
  3. Kullanıcı sağa kaydırmaya devam ediyor ve pencerenin ana ekrandaki simgeye küçüldüğünü gösteren bir animasyon gösteriliyor.
  4. Kullanıcı artık ana ekrana tamamen geri döndü.

Tahmini geri hareketleri için destek ekleme hakkında daha fazla bilgi edinin.

Özel uygulama içi geçişler ve animasyonlar ekleme

Özel uygulama içi özellik animasyonları ve geçişleri, özel etkinlikler arası animasyonlar ve özel parça animasyonları oluşturabilirsiniz. Ayrıca, tahmini geri hareketleri de kullanabilirsiniz.

Progress API'yi kullanarak özel geçişler ekleme

AndroidX Activity 1.8.0-alpha01 veya sonraki sürümlerde, uygulamanızda tahmini geri hareket için özel animasyonlar geliştirmek üzere Predictive Back Progress API'lerini kullanabilirsiniz. Progress API'leri, görünümleri animasyonla hareketlendirmede faydalıdır ancak parçalar arasındaki geçişleri animasyonla hareketlendirmede sınırlamaları vardır. OnBackPressedCallback içinde, kullanıcı geri kaydırırken nesneleri canlandırmak için handleOnBackProgressed, handleOnBackCancelled ve handleOnBackStarted yöntemlerini kullanıma sunduk. Sistem veya Material Component animasyonları tarafından sağlanan varsayılan animasyonlardan daha fazlasını özelleştirmeniz gerekiyorsa bu yöntemleri kullanın.

Çoğu uygulamanın geriye dönük uyumlu AndroidX API'lerini kullanmasını bekliyoruz. Ancak Android 14 Developer Preview 1 ve sonraki sürümlerde test edilebilecek OnBackAnimationCallback arayüzünde benzer platform API'leri de mevcuttur.

AndroidX Transitions ile Progress API'lerini kullanma

Progress API'leri, Android 14 ve sonraki sürümlerde AndroidX Transitions 1.5.0-alpha01 veya sonraki sürümlerle birlikte kullanılarak Tahmini Geri Geçişleri oluşturulabilir.

  1. Kullanıcı geri kaydırdığında geçişleri oynatmak için beginDelayedTransition yerine TransitionManager#controlDelayedTransition kullanın.
  2. Geçişi handleOnBackStarted içinde oluşturun.
  3. Kullanıcının ne kadar geri kaydırdığını gösteren BackEvent.progress ile currentFraction arasında ilişki kurarak handleOnBackProgressed içinde geri etkinliğiyle geçişi oynatın.
  4. Kullanıcı handleOnBackPressed uygulamasında geri hareketini yaptıktan sonra geçişi tamamlayın.
  5. Son olarak, geçişin durumunu handleOnBackCancelled içinde sıfırlayın.

Aşağıdaki video, Kotlin kodu ve XML, OnBackPressedCallback ile uygulanan iki kutu arasında özel bir geçişi gösterir:

    class MyFragment : Fragment() {

    val transitionSet = TransitionSet().apply {
        addTransition(Fade(Fade.MODE_OUT))
        addTransition(ChangeBounds())
        addTransition(Fade(Fade.MODE_IN))
    }
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val callback = object : OnBackPressedCallback(enabled = false) {

            var controller: TransitionSeekController? = null

            @RequiresApi(34)
            override fun handleOnBackStarted(backEvent: BackEvent) {
                // Create the transition
                controller = TransitionManager.controlDelayedTransition(
                    binding.card,
                    transitionSet
                )
                changeTextVisibility(ShowText.SHORT)
            }

            @RequiresApi(34)
            override fun handleOnBackProgressed(backEvent: BackEvent) {
                // Play the transition as the user swipes back
                if (controller?.isReady == true) {
                    controller?.currentFraction = backEvent.progress
                }
            }

            override fun handleOnBackPressed() {
                // Finish playing the transition when the user commits back
                controller?.animateToEnd()
                this.isEnabled = false
            }

            @RequiresApi(34)
            override fun handleOnBackCancelled() {
                // If the user cancels the back gesture, reset the state
                transition(ShowText.LONG)
            }
        }

        binding.shortText.setOnClickListener {
            transition(ShowText.LONG)
            callback.isEnabled = true
        }

        this.requireActivity().onBackPressedDispatcher.addCallback(callback)
    }

    private fun transition(showText: ShowText) {
        TransitionManager.beginDelayedTransition(
            binding.card,
            transitionSet
        )
        changeTextVisibility(showText)
    }

    enum class ShowText { SHORT, LONG }
    private fun changeTextVisibility(showText: ShowText) {
        when (showText) {
            ShowText.SHORT -> {
                binding.shortText.isVisible = true
                binding.longText.isVisible = false
            }
            ShowText.LONG -> {
                binding.shortText.isVisible = false
                binding.longText.isVisible = true
            }
        }
    }
}
  
<?xml version="1.0" encoding="utf-8"?>
...
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/card"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ...>

        <TextView
            android:id="@+id/short_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            ... />

        <TextView
            android:id="@+id/long_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"
            .../>

    </androidx.constraintlayout.widget.ConstraintLayout>

Tahmini Geri geçişleriyle çalışırken aşağıdakileri göz önünde bulundurun:

  • Geçişin Tahmini Geri'yi destekleyip desteklemediğini kontrol etmek için isSeekingSupported simgesini kullanın.
  • Özel geçişleriniz için doğru değerini döndürmek üzere isSeekingSupported değerini geçersiz kılın.
  • Her animasyon için bir denetleyici oluşturun.
  • Tahmini Geri geçişleri, AndroidX geçişleriyle desteklenir ancak çerçeve geçişleriyle desteklenmez. Framework geçişlerinden uzaklaşın ve bunun yerine Animator ile AndroidX geçişlerini kullanın.
  • Tahmini geri geçişleri, Android 14 ve sonraki sürümlerin yüklü olduğu cihazlarda desteklenir ve geriye dönük olarak uyumlu değildir.
  • XML sahneleriyle oluşturulan geçişler de desteklenir. handleOnBackStarted içinde TransitionSeekController değerini controlDelayedTransition sonucu yerine TransitionManager.createSeekController sonucuna ayarlayın.

Android 14 ve sonraki sürümlerde özel etkinlik geçişleri ekleme

Özel etkinlik geçişlerinin Android 14 ve sonraki sürümlerde Tahmini Geri'yi desteklemesini sağlamak için overridePendingTransition yerine overrideActivityTransition kullanabilirsiniz. Bu, kullanıcının geri kaydırmasıyla birlikte geçiş animasyonunun oynatılacağı anlamına gelir.

Bunun nasıl çalışabileceğine dair bir örnek vermek için, geri yığında B etkinliğinin A etkinliğinin üzerinde olduğu bir senaryo düşünün. Özel etkinlik animasyonlarını aşağıdaki şekilde işlersiniz:

  • Etkinlik B'nin onCreate yönteminde açılış veya kapanış geçişlerini çağırın.
  • Kullanıcı B etkinliğine gittiğinde OVERRIDE_TRANSITION_OPEN kullanın. Kullanıcı, A etkinliğine geri dönmek için kaydırdığında OVERRIDE_TRANSITION_CLOSE kullanın.
  • OVERRIDE_TRANSITION_CLOSE belirtilirken enterAnim, A etkinliğinin giriş animasyonu, exitAnim ise B etkinliğinin çıkış animasyonudur.

Parçalarla tahmin edilen geri gitme için destek ekleme

Tahmin edilen geri gitme özelliğini parçalarla uygularken iki yaklaşım vardır.

Mevcut API'leri kullanma

Mevcut API'leri kullanmanızı öneririz. Bu API'ler, ekranın kenarından kaydırarak Animator veya Androidx geçişlerinizi hareketle değiştirmenize olanak tanır. Hareketi bir eşiğin ötesine taşıyıp taşımadığınız, hareketin tamamlanıp tamamlanmayacağını ve önceki parçaya dönüp dönmeyeceğinizi ya da hareketin iptal edilip edilmeyeceğini ve mevcut parçada kalıp kalmayacağınızı belirler. Daha fazla bilgi için Animasyonları kullanarak parçalar arasında gezinme başlıklı makaleyi inceleyin.

Aşağıdaki faktörleri göz önünde bulundurun:

  • Transitions 1.5.0 veya sonraki sürümleri ve Fragments 1.7.0 veya sonraki sürümleri içe aktarın. Fragment'lerdeki tahmini geri desteklerinin çoğu, Geçişlerin animasyonları arayabilmesine bağlıdır. Bu da yalnızca Geçişler 1.5.0 veya sonraki sürümlerde mümkündür.
  • Geri yığınını işlemek için FragmentManager veya Navigation Component ile birlikte Fragment'leri kullanın. Kendi geri yığını yönetiyorsanız Tahmini Geri Gitme desteklenmez. FragmentManager'nın bilmediği geri yığınlarından uzaklaşın.
  • Bazı kitaplıklar, Tahmini Geri özelliğini destekler. Emin olmak için dokümanları kontrol edin.
  • Animator sınıfı ve AndroidX Transition kitaplığı desteklenir.
  • Animation sınıfı ve Transition kitaplığı desteklenmez.
  • Tahmini animasyonlar yalnızca Android 14 veya sonraki sürümlerin yüklü olduğu cihazlarda çalışır.

Aşağıdaki durumlarda tahmini geri gitme özelliğini kullanarak parçalar arası geçiş yapın:

Materyal hareketlerinden bazıları, MaterialFadeThrough, MaterialSharedAxis ve MaterialFade dahil olmak üzere 1.12.02-alpha02 veya sonraki sürümlerde tahmini geri özelliğini destekler. Not: MaterialContainerTransform, tahmini geri gitme özelliğini desteklemez.

Geri aramaları kullanma

Geri çağırmaları kullanarak parçalar arası geçiş oluşturabilirsiniz. Ancak geri çağırmaları kullanırken bilinen bir sınırlama vardır. Bu sınırlama nedeniyle kullanıcılar, geri kaydırdıklarında önceki parçayı göremez. Tahmini geri gitme tasarım kılavuzuna karşılık gelen, parçalar arası ortak öğe geçişi oluşturmak için aşağıdakileri yapın:

OnBackPressedCallback oluşturun. handleOnBackProgressed içinde, parçayı ölçeklendirin ve kaydırın. Ardından, arka yığından çıkarın. Ardından, geri çağırma işlevinin dışında setSharedElementReturnTransition kullanarak paylaşılan öğe geçişini çalıştırın.

Daha fazla bilgi için GitHub'daki kod örneğine bakın.

Şartlar

targetSdkVersion ve compileSdkVersion, cihaz sürümü, bağımlılıklar, manifest işaretleri ve parça işaretleri tarafından neyin kontrol edildiğini anlamak için aşağıdaki tabloyu kullanın. Bu tabloda kod gereksinimleri açıklanmaktadır.

Kategori Animasyon compileSdk targetSdk Cihaz sürümü android:enableOnBackInvokedCallback Bağımlılık
Sistem Animasyonları Ana sayfaya dönme 33 Tümü 35 DOĞRU Yok
Etkinlikler arası 34 Tümü 35 DOĞRU Yok
Görevler arası 34 Tümü 35 DOĞRU Yok
Platform Özel etkinlikler arası 34 Tümü 35 DOĞRU Yok
Progress API Platform 34 Tümü 34 DOĞRU Yok
Material Bileşenleri Alt Sayfa 34 Tümü 34 DOĞRU Material Component 1.10.0
Yan Sayfa 34 Tümü 34 DOĞRU Material Component 1.10.0
Gezinme Çekmecesi 34 Tümü 34 DOĞRU Material Component 1.10.0
Arat 34 Tümü 34 DOĞRU Material Component 1.10.0
Jetpack Animations Özel AndroidX fragmentler arası geçiş 34 Tümü 34 DOĞRU AndroidX Fragment 1.7
Özel AndroidX Geçişleri 34 Tümü 34 DOĞRU AndroidX Transition 1.5
Progress API Jetpack 34 Tümü 34 DOĞRU AndroidX Activity 1.8

Ek Kaynaklar