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

Uygulamanızı zaten yeni sistem geri API'lerine taşıdıysanız şunları yapabilirsiniz: uygulama içi e-postaları otomatik olarak almak için tahmini geri almayı etkinleştirin animasyonları destekler ve özel geçişleri de destekler.

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

ziyaret edin.
Video: Tahmine dayalı geri sayım animasyonları

Etkinleştirildikten sonra uygulamanızda ana sayfaya geri dönüş, çapraz etkinlik, etkinlik sonu yeni bir beceridir.

Malzeme bileşeni bağımlılığınızı MDC'nin v1.10.0 sürümüne de yükseltebilirsiniz Aşağıdaki gibi malzeme bileşeni animasyonları almak için Android:

Daha fazla bilgi için GitHub'da malzeme bileşen geliştirici kılavuzuna bakın ekleyebilirsiniz.

Bu videoda, şunun için tahmini geri animasyonlara dair kısa bir örnek çapraz etkinlik ve ana sayfaya geri dönme özelliklerini kullanabilirsiniz.

  1. Animasyonda kullanıcı önceki ayarlara dönmek için ekranı geri kaydırıyor ekranı gibi gösterilir.
  2. Önceki ekranda kullanıcı ikinci bir kez geri kaydırmaya başlıyor. Duvar kağıdıyla birlikte ana ekranın bir önizlemesini gösteriyor. Örneğin, ana ekrana dönüş animasyonunu oluşturur.
  3. Kullanıcı, ekranı sağa kaydırmaya devam ederek pencerenin animasyonu gösterilir ana ekrandaki simgeye küçültülür.
  4. Kullanıcı tamamen ana ekrana döndü.

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

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

Özel uygulama içi mülk animasyonları ve geçişleri oluşturmak için Progress API ve özel etkinlikler arası animasyonlar yöntemi overrideActivityTransition

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

AndroidX Etkinliği 1.8.0-alpha01 veya sonraki sürümlerde Tahmine Dayalı Geri gitme Şunun için özel animasyonlar geliştirmek için ilerleme API'leri: tahmine dayalı geri hareketini etkinleştirin. Şu süre içinde: OnBackPressedCallback handleOnBackProgressed, handleOnBackCancelled ve Kullanıcı geri kaydırırken nesnelere animasyon eklemek için handleOnBackStarted yöntem. Tekliflerinizi otomatikleştirmek ve optimize etmek için varsayılan animasyonlardan daha özel bir şeye ihtiyacınız varsa bu yöntemleri kullanabilirsiniz. yeni sistem animasyonları veya Malzeme Bileşeni animasyonları tarafından sağlanan şemadır.

Çoğu uygulamanın, geriye dönük uyumlu AndroidX API'lerini kullanmasını bekliyoruz, ancak içindeki benzer platform API'leri OnBackAnimationCallback arayüz, Android 14 Geliştirici Önizlemesi 1 ve sonraki sürümlerde test edilebilir.

AndroidX Transitions ile İlerleme API'lerini kullanma

Progress API'leri, AndroidX Transitions 1.5.0-alpha01 veya sonraki sürümlerle kullanılabilir kullanarak Tahmine Dayalı Geri Geçişleri oluşturabilirsiniz.

  1. Bunun yerine TransitionManager#controlDelayedTransition kullan Geçişleri şu şekilde oynatmak için beginDelayedTransition: Kullanıcı geri kaydırır.
  2. Geçişi handleOnBackStarted içinde oluşturun.
  3. Geçişi, handleOnBackProgressed içinde önceki etkinliğiyle birlikte oynatın. currentFraction ile BackEvent.progress arasındaki ilişki, ne kadar uzak olduğunu Kullanıcı geri kaydırır.
  4. Kullanıcı geri hareketini uyguladıktan sonra geçişi tamamlayın handleOnBackPressed
  5. Son olarak, handleOnBackCancelled içindeki geçişin durumunu sıfırlayın.

Aşağıdaki video, Kotlin kodu ve XML'de özel bir geçiş gösterilmiştir OnBackPressedCallback ile uygulanan iki kutu arasında şunlar vardır:

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şlerle çalışırken aşağıdakilere dikkat edin:

  • Geçişin Tahmine Dayalı Geri'yi destekleyip desteklemediğini kontrol etmek için isSeekingSupported öğesini kullanın.
  • Özel geçişlerinizin doğru değerine döndürülmesi için isSeekingSupported değerini geçersiz kılın.
  • Animasyon başına bir denetleyici oluşturun.
  • Tahmine dayalı geri geçişler, AndroidX geçişlerinde desteklenir. ancak çerçeve geçişlerinde geçerli değil. Çerçeveden başka bir sisteme geçiş yapmanızı öneririz oluşturabilirsiniz.
  • Tahmine dayalı geri geçişler, Android 14 ve sonraki sürümleri çalıştıran cihazlarda desteklenir. uyumlu değildir.
  • XML sahneleriyle oluşturulan geçişler de desteklenir. İçinde handleOnBackStarted, TransitionSeekController metriğinizi bu sonuç için ayarlayın Şunun sonucu: TransitionManager.createSeekController controlDelayedTransition.

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

Özel etkinlik geçişlerinin Android 14'te tahmin özelliğini desteklediğinden emin olmak için ve daha yüksek bir sayı için şunun yerine overrideActivityTransition kullanabilirsiniz: overridePendingTransition. Bu, geçiş animasyonunun Kullanıcı geri kaydırır.

Bunun nasıl olabileceğine dair bir örnek vermek için, B Etkinliği, arka yığındaki A Etkinliği'nin en üstündedir. Özel URL'ler, Etkinlik animasyonları aşağıdaki şekildedir:

  • B Etkinliği'nin onCreate içinde açma veya kapatma geçişlerini çağırın yöntemidir.
  • Kullanıcı B Etkinliği'ne gittiğinde OVERRIDE_TRANSITION_OPEN işlevini kullanın. Zaman Kullanıcı A Etkinliği'ne dönmek için kaydırır, OVERRIDE_TRANSITION_CLOSE
  • OVERRIDE_TRANSITION_CLOSE belirtilirken enterAnim, A Etkinliği'nin animasyonu girin ve exitAnim, B Etkinliği'nin çıkış animasyonudur.