Tahmine dayalı geri animasyonlar için destek eklendi

Sistem geri API'lerini kullanırken uygulama içi animasyonlar almayı tercih edebilir ve destekler.

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:

GitHub'daki malzeme bileşen geliştirici kılavuzuna bakın. daha fazla bilgi edinin.

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 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 mülk animasyonları ve geçişleri oluşturabilirsiniz. etkinlikler arası animasyonlar ve tahmine dayalı özel çapraz parça animasyonları geri hareketleri.

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. Progress API'leri, animasyon oluşturmak için görünümlerinin yanı sıra parçalar arasındaki geçişleri canlandırırken de sınırlamaları vardır. Şu süre içinde: OnBackPressedCallback proje yaşam döngüsünü handleOnBackProgressed, handleOnBackCancelled ve handleOnBackStarted Kullanıcı geri kaydırırken nesnelere animasyon eklemek için bir yöntem kullanabilir. Aşağıdaki durumlarda bu yöntemleri kullanın: sistem tarafından sağlanan varsayılan animasyonlardan daha fazlasının özelleştirilmesi gerekiyorsa veya animasyonları gibi.

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

  • 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. daha yüksek olduğu ve geriye dönük uyumlu olmadığı anlamına gelir.
  • 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 tahmine dayalı geri gitmeyi 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.

Parçalı Tahmine Dayalı Geri Dönme desteği ekle

Tahmine Dayalı Geri'yi parçalarla uygularken iki yaklaşım vardır.

Mevcut API'leri kullan

Mevcut API'leri kullanmanızı öneririz. Bu API'ler, sayfayı kaydırarak Animator veya Androidx geçişlerinizi hareketi yapın. Hareketin eşiğin dışına taşınıp taşınmaması, geri dönerseniz ya da önceki parçaya geri dönerseniz mevcut parçada kalır. Daha fazla bilgi için bkz. Animasyonları kullanarak parçalar arasında gezinin.

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

  • İçe aktarma Transitions 1.5.0 veya sonraki sürümler ve Parçalar 1.7.0 veya daha sonra. Fragments'taki tahmine dayalı arka desteğin çoğu Animasyonları arayabilen geçişler (yalnızca Geçişler 1.5.0 veya sonraki sürümler.
  • FragmentManager veya Arka yığını işleyecek Gezinme Bileşeni. Tahmini Kendi arka yığınınızı siz yönetiyorsanız geri özelliği desteklenmez.
  • Bazı kitaplıklarda Tahmine Dayalı Geri Dönme desteği bulunur. Dokümanları kontrol edin elbette.
  • Animator sınıfı ve AndroidX Transition kitaplığı desteklenir.
  • Animation sınıfı ve Transition çerçevesi kitaplığı desteklenmiyor.
  • Tahmine dayalı animasyonlar yalnızca Android 14 veya sonraki sürümleri çalıştıran cihazlarda çalışır.

Aşağıdaki durumlarda tahmini arka çapraz parçaları kullanın:

Bazı materyal hareketler şu andan itibaren tahmine dayalı geri ödemeyi 1.12.02-alfa02 veya daha yüksek, MaterialFadeThrough, MaterialSharedAxis ve MaterialFade. MaterialContainerTransform adlı operatörün tahmin özelliğini desteklemediğini unutmayın geri dönüyor.

Geri çağırmaları kullan

Geri çağırma işlevleri kullanarak çapraz parça geçişi oluşturabilirsiniz ancak kullanıcıların önceki arama verilerini göremediği geri çağırmaların kullanımıyla ilgili bilinen sınırlama, parçasına sahip oluyor. Çapraz parçalı paylaşılan öğe geçişi oluşturmak için tahmine dayalı geri dönüşe karşılık gelen tasarım kılavuzundan yararlanabilirsiniz. takip etmek için:

OnBackPressedCallback oluşturun. handleOnBackProgressed içinde ölçeklendirin ve ve parçayı kaydırın. Sonra da arkadaki gruplardan çıkın. Ardından, paylaşılan öğeyi çalıştırın geri çağırma dışında setSharedElementReturnTransition kullanarak geçiş yapın.

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

Gereksinimler

Geliştirici seçenekleri tarafından nelerin kontrol edildiğini anlamak için aşağıdaki tablolardan targetSdkVersion ve compileSdkVersion, cihaz sürümü, bağımlılıklar, parça işaretleri için de geçerlidir. İlk tablo, kod gereklilikleriyle ilgilidir.

Kategori Animasyon derleme SDK'sı hedef SDK android:enableOnBackInvokedCallback Bağımlılık
Sistem Animasyonları Ana sayfaya dönüş 33 Tümü DOĞRU Yok
Çapraz etkinlikler 34 Tümü DOĞRU Yok
Çapraz görev 34 Tümü DOĞRU Yok
Platform Özel çapraz etkinlik 34 Tümü DOĞRU Yok
İlerleme API Platformu 34 Tümü DOĞRU Yok
Material Bileşenleri Alt Sayfa 34 Tümü DOĞRU Malzeme Bileşeni 1.10.0
Yan Sayfa 34 Tümü DOĞRU Malzeme Bileşeni 1.10.0
Gezinme Çekmecesi 34 Tümü DOĞRU Malzeme Bileşeni 1.10.0
Arama 34 Tümü DOĞRU Malzeme Bileşeni 1.10.0
Jetpack Animasyonları Özel AndroidX çapraz parçası 34 Tümü DOĞRU AndroidX Parçası 1.7
Özel AndroidX Geçişleri 34 Tümü DOĞRU AndroidX Geçişi 1.5
İlerleme API'si Jetpack 34 Tümü DOĞRU AndroidX Etkinlik 1.8

Aşağıdaki tabloda, kullanıcıların animasyonları görmesine izin veren gereksinimler açıklanmaktadır.

Kategori Animasyon Geliştirici Seçeneği etkin Cihaz sürümü
Sistem Animasyonları Ana sayfaya dönüş DOĞRU 33
Çapraz etkinlikler DOĞRU 34
Çapraz görev DOĞRU 34
Platform Özel çapraz etkinlik DOĞRU 34
İlerleme API Platformu YANLIŞ 34
Material Bileşenleri Alt Sayfa YANLIŞ 34
Yan Sayfa YANLIŞ 34
Gezinme Çekmecesi YANLIŞ 34
Arama YANLIŞ 34
Jetpack Animasyonları Özel AndroidX çapraz parçası YANLIŞ 34
Özel AndroidX Geçişleri YANLIŞ 34
İlerleme API'si Jetpack YANLIŞ 34

Ek Kaynaklar