Yerleşik ve özel tahmine dayalı geri animasyonları için destek eklendi

Uygulamanızı zaten yeni sistem geri API'lerine taşıdıysanız uygulama içi animasyonları otomatik olarak almak için tahmine dayalı geri almayı seçebilir ve özel geçişleri de destekleyebilirsiniz.

Yerleşik uygulama içi animasyonlar için destek eklendi

Video: Tahmine dayalı geri animasyonları

Kaydolduktan sonra uygulamanızda ana sayfaya geri dönme, çapraz etkinlik ve görevler arası animasyonlar gösterilir.

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

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

Videoda, Android Ayarları uygulaması kullanılarak çapraz etkinlik ve eve dönüş için tahmine dayalı geri animasyonlara dair kısa bir örnek gösterilmektedir.

  1. Animasyonda, kullanıcı geri kaydırarak önceki ayarlar ekranına (bir çapraz etkinlik animasyonu örneği) geri döner.
  2. Önceki ekranda kullanıcı ikinci bir kez geri kaydırmaya başlar. Ana ekranın, duvar kağıdıyla birlikte bir önizlemesini (ana sayfaya geri dönüş animasyonu örneği) gösterir.
  3. Kullanıcı, ekranı sağa kaydırmaya devam eder ve ana ekrandaki simgeye küçülen pencerenin animasyonu gösterilir.
  4. Kullanıcı artık tamamen ana ekrana dönmüştür.

Tahmine dayalı geri ödemeyi destekleme hakkında daha fazla bilgi edinin.

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

İlerleme API'sini ve özel etkinlikler arası animasyonlar yöntemini overrideActivityTransition kullanarak özel uygulama içi mülk animasyonları ve geçişleri oluşturabilirsiniz.

İlerleme API'sini kullanarak özel geçişler ekleme

AndroidX Activity 1.8.0-alpha01 veya sonraki sürümlerde, uygulamanızdaki tahmine dayalı geri hareketi için özel animasyonlar geliştirmek üzere Tahmine Dayalı Geri İlerleme API'larını kullanabilirsiniz. OnBackPressedCallback içinde, kullanıcı geri kaydırırken nesneleri canlandırmak için handleOnBackProgressed, handleOnBackCancelled ve handleOnBackStarted yöntemlerini kullanıma sunduk. Yeni sistem animasyonları veya Malzeme Bileşeni animasyonlarının sağladığı varsayılan animasyonlardan daha özel bir şeye ihtiyacınız varsa bu yöntemleri kullanın.

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

İlerleme API'larını AndroidX Transitions ile kullanma

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

  1. Kullanıcı geri kaydırırken geçişleri oynatmak için beginDelayedTransition yerine TransitionManager#controlDelayedTransition kullanın.
  2. Geçişi handleOnBackStarted içinde oluşturun.
  3. currentFraction ile BackEvent.progress arasında ilişki kurarak handleOnBackProgressed içinde geri etkinliğiyle geçişi oynatın. Bu, kullanıcının ne kadar geri kaydırdığını gösterir.
  4. Kullanıcı handleOnBackPressed ürününde geri hareketini gerçekleştirdikten 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>

Tahmine Dayalı Geri Geçişleriyle çalışırken aşağıdakilere dikkat edin:

  • Geçişin Tahmini Geriye Dönük özelliğini destekleyip desteklemediğini kontrol etmek için isSeekingSupported öğesini kullanın.
  • Özel geçişlerinizde "doğru" değerini alması için isSeekingSupported değerini geçersiz kılın.
  • Animasyon başına bir denetleyici oluşturun.
  • Tahmine Dayalı Geri Geçişleri, AndroidX geçişlerinde desteklenir ancak çerçeve geçişleriyle desteklenmez. Çerçeve geçişlerinden uzaklaşmanızı öneririz.
  • Tahmine Dayalı Geri geçişleri, Android 14 ve sonraki sürümlerin yüklü olduğu cihazlarda desteklenir ve geriye dönük uyumluluğa sahip değildir.
  • XML sahneleriyle oluşturulan geçişler de desteklenir. handleOnBackStarted içinde TransitionSeekController özelliğini controlDelayedTransition yerine TransitionManager.createSeekController sonucu olarak 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 tahmine dayalı geri dönüşü desteklediğinden emin olmak için overridePendingTransition yerine overrideActivityTransition kullanabilirsiniz. Bu, kullanıcı hızlıca geri kaydırırken geçiş animasyonunun oynatılacağı anlamına gelir.

Bunun nasıl işlediğine dair bir örnek vermek için B etkinliğinin arka yığında A etkinliğinin üstünde olduğu bir senaryo düşünün. Özel Etkinlik animasyonlarını aşağıdaki şekilde işlersiniz:

  • B Etkinliğinin onCreate yönteminde açılış veya kapanış geçişlerini çağırın.
  • Kullanıcı B Etkinliği'ne gittiğinde OVERRIDE_TRANSITION_OPEN işlevini kullanın. Kullanıcı A Etkinliği'ne geri dönmek için ekranı kaydırdığında OVERRIDE_TRANSITION_CLOSE özelliğini kullanın.
  • OVERRIDE_TRANSITION_CLOSE belirtilirken enterAnim, A Etkinliğinin giriş animasyonu ve exitAnim, B Etkinliğinin çıkış animasyonudur.