Tahmine dayalı geri animasyonlar için destek eklendi

Sistem geri API'larını kullanırken uygulama içi animasyonlar almayı tercih edebilir ve özel geçişleri destekleyebilirsiniz.

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 hareketleri için destek ekleme hakkında daha fazla bilgi edinin.

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

Tahmine dayalı geri hareketleriyle özel uygulama içi mülk animasyonları ve geçişleri, özel etkinlik arası animasyonlar ve özel çapraz parça animasyonlar oluşturabilirsiniz.

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

AndroidX Activity 1.8.0-alpha01 veya sonraki sürümlerle, uygulamanızdaki tahmine dayalı geri hareketi için özel animasyonlar geliştirmek üzere Tahmine Dayalı Geri İlerleme API'larını kullanabilirsiniz. İlerleme API'ları görünümleri canlandırmada yardımcı olur ancak parçalar arasındaki geçişleri canlandırırken sınırlamalara sahiptir. OnBackPressedCallback içinde, kullanıcı geri kaydırırken nesneleri canlandırmak için handleOnBackProgressed, handleOnBackCancelled ve handleOnBackStarted yöntemlerini kullanıma sunduk. Sistem tarafından sağlanan varsayılan animasyonlardan veya Malzeme Bileşeni 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ı 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ğıdakileri göz önünde bulundurun:

  • 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ümleri çalıştıran cihazlarda desteklenir ancak geriye dönük uyumlu 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ı Geriyi desteklemesini sağlamak 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.

Parçalı Tahmini Geri için destek ekleme

Tahmine dayalı geri yükleme özelliğini parçalarla uygularken iki yaklaşımdan yararlanabilirsiniz.

Mevcut API'leri kullan

Mevcut API'leri kullanmanızı öneririz. Bu API'ler, hareketle Animator veya Androidx geçişlerinizi değiştirmek için ekranın kenarından hızlıca kaydırmanıza olanak tanır. Hareketi bir eşiği geçtikten sonra taşımanız, tamamlanıp önceki parçaya geri dönmeniz veya hareketin iptal edilip mevcut parçada kalacağınız anlamına gelir. Daha fazla bilgi için Animasyonları kullanarak parçalar arasında gezinme bölümüne bakın.

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

  • Transitions 1.5.0 veya sonraki sürümler ve Fragments 1.7.0 veya sonraki sürümler. Fragments içindeki tahmine dayalı geri desteğin çoğu, Geçişlerin animasyonları arama özelliğine dayanır. Bu işlem yalnızca Geçiş 1.5.0 veya sonraki sürümlerde mümkündür.
  • Arka yığını işlemek için FragmentManager veya Gezinme Bileşeni ile birlikte Fragment'ları kullanın. Kendi arka yığınınızı yönetiyorsanız Tahmine Dayalı Geri özelliği desteklenmez.
  • Bazı kitaplıklarda Predictive Back desteği bulunur. Emin olmak için belgeleri inceleyin.
  • Animator sınıfı ve AndroidX Transition kitaplığı desteklenir.
  • Animation sınıfı ve çerçeve Transition kitaplığı desteklenmiyor.
  • Tahmine dayalı animasyonlar yalnızca Android 14 veya sonraki sürümleri çalıştıran cihazlarda çalışır.

Aşağıdaki durumlarda tahmine dayalı geri çapraz parçaları kullanın:

MaterialFadeThrough, MaterialSharedAxis ve MaterialFade dahil olmak üzere bazı materyal hareketler 1.12.02-alpha02 veya sonraki sürümlerde tahmine dayalı geri dönüşü destekler. MaterialContainerTransform hizmetinin tahmine dayalı geri dönüşü desteklemediğini unutmayın.

Geri çağırmaları kullanma

Geri çağırmaları kullanarak çapraz parça geçiş oluşturabilirsiniz ancak geri çağırma kullanılırken kullanıcıların geri kaydırdıklarında önceki parçayı göremediği bilinen bir sınırlama vardır. Tahmine dayalı geri tasarım kılavuzuna karşılık gelen bir çapraz parça paylaşılan öğ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. Sonra da arkadaki gruptan fırlatın. Ardından, geri çağırma dışında setSharedElementReturnTransition kullanarak paylaşılan öğe geçişini çalıştırın.

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

Gereksinimler

Geliştirici seçenekleri, targetSdkVersion ve compileSdkVersion, cihaz sürümü, bağımlılıklar, manifest işaretleri ve parça işaretleri tarafından nelerin kontrol edildiğini anlamak için aşağıdaki tablolardan yararlanın. İlk tablo kod gereksinimlerine yöneliktir.

Kategori Animasyonlar derleme Sdk hedef SDK android:enableOnBackInvokedCallback Bağımlılık
Sistem Animasyonları Ana Sayfaya Dönüş 33 Tümü DOĞRU Yok
Çapraz etkinlik 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ça 1.7
Özel AndroidX Geçişleri 34 Tümü DOĞRU AndroidX Geçişi 1.5
İlerleme API'sı Jetpack 34 Tümü DOĞRU AndroidX Etkinliği 1.8

Aşağıdaki tabloda, kullanıcıların animasyonları görmesine izin veren koşullar belirtilmiştir.

Kategori Animasyonlar Geliştirici Seçeneği etkin Cihaz sürümü
Sistem Animasyonları Ana Sayfaya Dönüş DOĞRU 33
Çapraz etkinlik 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'sı Jetpack YANLIŞ 34

Ek Kaynaklar