Tahmine dayalı geri animasyonlar için destek eklendi

Sistem destekli API'leri kullanırken uygulama içi animasyonlar almayı etkinleştirebilir ve özel geçişleri destekleyebilirsiniz.

Video 1: Tahmin edilen geri animasyonlar

Bu özelliği etkinleştirdikten sonra uygulamanız ana sayfaya geri dönme, etkinlik ve görevler arasında geçiş yapma animasyonlarını gösterir.

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

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

Videoda, Android Ayarlar uygulaması kullanılarak etkinlikler arasında geçiş yapma ve ana ekrana geri dönme için tahmini geri animasyonlara dair kısa bir örnek gösterilmektedir.

  1. Animasyonda, kullanıcı önceki ayarlar ekranına dönmek için geri kaydırmaktadır. Bu, etkinlik arası animasyon örneğidir.
  2. Kullanıcı, önceki ekranda ikinci kez geri kaydırmaya başlar. Bu sırada, ana ekranın duvar kağıdıyla birlikte önizlemesi gösterilir. Bu, ana ekrana geri dönme animasyonuna örnektir.
  3. Kullanıcı sağa kaydırmaya devam eder. Pencerenin ana ekrandaki simge boyutuna küçüldüğü animasyon gösterilir.
  4. Kullanıcı artık ana ekrana tamamen geri döndü.

Tahmini geri hareketleri destekleme hakkında daha fazla bilgi edinin.

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

Tahmini geri hareketleriyle özel uygulama içi mülk animasyonları ve geçişler, özel etkinlik arası animasyonlar ve özel parçalar arası animasyonlar oluşturabilirsiniz.

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

AndroidX Activity 1.8.0-alpha01 veya sonraki sürümlerde, uygulamanızdaki tahmini geri hareketi için özel animasyonlar geliştirmek üzere Tahmini Geri İlerleme API'lerini kullanabilirsiniz. İlerleme API'leri, görünümleri animasyonlu hale getirmede faydalıdır ancak parçalar arasındaki geçişleri animasyonlu hale getirmede sınırlamaları vardır. OnBackPressedCallback sürümünde, kullanıcı geri kaydırdığı sırada nesneleri canlandırmak için handleOnBackProgressed, handleOnBackCancelled ve handleOnBackStarted yöntemlerini kullanıma sunduk. Sistem tarafından sağlanan varsayılan animasyonlardan veya Material Component animasyonlarından 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ı bekleriz. Bununla birlikte, Android 14 Geliştirici Önizlemesi 1 ve sonraki sürümlerde test edebileceğiniz OnBackAnimationCallback arayüzünde benzer platform API'leri de vardır.

AndroidX geçişleriyle Progress API'leri kullanma

İlerleme API'leri, Android 14 ve sonraki sürümlerde Tahmini Geri geçişleri oluşturmak için AndroidX Geçişler 1.5.0-alpha01 veya sonraki sürümlerle kullanılabilir.

  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. currentFraction'u BackEvent.progress ile ilişkilendirerek handleOnBackProgressed içinde geri etkinliğiyle geçişi oynatın. Bu, kullanıcının geri ne kadar kaydırdığını gösterir.
  4. Kullanıcı handleOnBackPressed'te geri hareketini tamamladıktan sonra geçişi tamamlayın.
  5. Son olarak, handleOnBackCancelled içinde geçişin durumunu 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östermektedir:

    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şlerle çalışırken aşağıdakileri göz önünde bulundurun:

  • Geçişin tahmini geri özelliğini 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şler AndroidX geçişlerinde desteklenir ancak çerçeve geçişlerinde desteklenmez. Çerçeve geçişlerinden uzaklaşın ve bunun yerine Animator ve AndroidX geçişlerini kullanın.
  • Tahmini Geri geçişleri, Android 14 ve sonraki sürümleri çalıştıran cihazlarda desteklenir ve geriye dönük uyumlu değildir.
  • XML sahneleriyle oluşturulan geçişler de desteklenir. handleOnBackStarted içinde, TransitionSeekController'unuzu 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 özelliğini desteklemesini sağlamak için overridePendingTransition yerine overrideActivityTransition kullanabilirsiniz. Bu, kullanıcı geri kaydırdığı sırada geçiş animasyonunun oynatılacağı anlamına gelir.

Bunun nasıl işleyebileceğine dair bir örnek vermek için arka yığınta B etkinliğinin A etkinliğinin üzerinde olduğu bir senaryo düşünün. Özel etkinlik animasyonları aşağıdaki şekilde işlenir:

  • B etkinliğinin onCreatemetodunda açılış veya kapanış geçişlerini çağırın.
  • Kullanıcı B etkinliğine gittiğinde OVERRIDE_TRANSITION_OPEN değerini kullanın. Kullanıcı A etkinliğine geri gitmek için ekranı kaydırdığında OVERRIDE_TRANSITION_CLOSE öğesini kullanın.
  • OVERRIDE_TRANSITION_CLOSE belirtilirken enterAnim, A etkinliğinin giriş animasyonu, exitAnim ise B etkinliğinin çıkış animasyonudur.

Parçalarla tahmini geri gitme desteği ekleme

Tahmini Geri ö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 önceki parçaya dönüp dönmeyeceğinizi veya iptal edilip 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:

  • Geçişler 1.5.0 veya sonraki sürümleri ve Bölüntüler 1.7.0 veya sonraki sürümleri içe aktarın. Fragments'teki tahmini geri desteğinin büyük kısmı, Geçişler'in animasyon arayabilmesine bağlıdır. Bu 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 Gezinme Bileşeni ile birlikte Fragment'leri kullanın. Kendi geri yığınınızı yönetiyorsanız tahmini geri özelliği desteklenmez. FragmentManager'nin bilmediği arka yığınlardan uzaklaşın.
  • Bazı kitaplıklarda tahmini geri desteği bulunur. Emin olmak için dokümanları kontrol edin.
  • Animator sınıfı ve AndroidX Transition kitaplığı desteklenir.
  • Animation sınıfı ve Transition çerçeve kitaplığı desteklenmez.
  • Tahmini animasyonlar yalnızca Android 14 veya sonraki sürümlerin yüklü olduğu cihazlarda çalışır.

Tahmini geri çapraz parçaları aşağıdaki durumlarda kullanın:

Bazı maddi hareketler, MaterialFadeThrough, MaterialSharedAxis ve MaterialFade dahil olmak üzere 1.12.02-alpha02 veya sonraki sürümlerde tahmini geri desteği sunar. MaterialContainerTransform, tahmini geri oynatma özelliğini desteklemez.

Geri aramaları kullanma

Geri çağırma işlevlerini kullanarak parçalar arası geçiş oluşturabilirsiniz. Ancak geri çağırma işlevleri kullanıldığında, kullanıcıların geri kaydırırken önceki parçayı görememesi gibi bilinen bir sınırlama vardır. Tahmini geri tasarım kılavuzuna uygun bir parçalar arası paylaşılan öğe geçişi oluşturmak için aşağıdakileri yapın:

Bir OnBackPressedCallback oluşturun. handleOnBackProgressed içinde, parçayı ölçeklendirin ve kaydırın. Ardından, arkadaki yığıntan çı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ılar, manifest işaretleri ve parça işaretleri tarafından nelerin kontrol edildiğini anlamak için aşağıdaki tablodan yararlanın. Bu tabloda kod koşulları açıklanmaktadır.

Kategori Animasyon compileSdk targetSdk Cihaz sürümü android:enableOnBackInvokedCallback Bağımlılık
Sistem Animasyonları Ana sayfaya dön 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 etkinlik 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 Animasyonları Özel AndroidX köprü fragmanı 34 Tümü 34 DOĞRU AndroidX Fragment 1.7
Özel AndroidX Geçişleri 34 Tümü 34 DOĞRU AndroidX Geçişi 1.5
Progress API Jetpack 34 Tümü 34 DOĞRU AndroidX Activity 1.8

Ek Kaynaklar