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.

Ayrıca, aşağıdaki gibi materyal bileşen animasyonlarını almak için malzeme bileşeni bağımlılığınızı MDC'nin v1.10.0 sürümüne 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

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

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

AndroidX Activity 1.8.0-alfa01 veya sonraki sürümlerinde Tahmine Dayalı Geri İlerleme API'lerini kullanarak uygulamanızda tahmine dayalı geri hareketi hareketi için özel animasyonlar geliştirebilirsiniz. İlerleme API'leri görünümler arasındaki geçişleri canlandırma konusunda sınırlamalara sahiptir. 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 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ı 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. Kullanıcının ne kadar geri kaydırdığını gösteren currentFraction ile BackEvent.progress arasında seçim yaparak handleOnBackProgressed içinde geri etkinliğiyle geçişi oynatın.
  4. Kullanıcı handleOnBackPressed uygulamasında geri hareketini uyguladıktan sonra geçişi tamamlayın.
  5. Son olarak, handleOnBackCancelled içindeki 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ş geçişleriyle ç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şlerinizin doğru değerine döndürülmesi için isSeekingSupported değerini geçersiz kılın.
  • Her animasyon için bir denetleyici oluşturun.
  • Tahmine dayalı geri geçişler, AndroidX geçişlerinde desteklenir ancak çerçeve geçişleriyle 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 öğenizi controlDelayedTransition 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ırırken geçiş animasyonunun oynatıldığı anlamına gelir.

Bunun nasıl olabileceğine dair bir örnek vermek için, B etkinliğinin arka yığındaki A etkinliğinin en üstünde 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çalı Tahmine Dayalı Geri Dönme desteği ekle

Tahmini Geri özelliğini parçalarla uygularken iki yaklaşım vardır.

Mevcut API'leri kullan

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 Fragmanlar'ı kullanın. Kendi geri yığınınızı yönetiyorsanız tahmini geri özelliği desteklenmez. FragmentManager ürününün bilmediği arka yığınlardan uzağa taşıyın.
  • Bazı kitaplıklarda tahmini geri desteği bulunur. Emin olmak için dokümanları inceleyin.
  • Animator sınıfı ve AndroidX Transition kitaplığı desteklenir.
  • Animation sınıfı ve Transition çerçevesi kitaplığı desteklenmiyor.
  • 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ırarak ö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:

OnBackPressedCallback oluşturun. handleOnBackProgressed içinde, parçayı ölçeklendirin ve kaydırın. Ardından, arkadaki gruplardan öne çıkı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 derleme SDK'sı 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 çapraz etkinlik 34 Tümü 35 DOĞRU Yok
İlerleme API Platformu 34 Tümü 34 DOĞRU Yok
Material Bileşenleri Alt Sayfa 34 Tümü 34 DOĞRU Malzeme Bileşeni 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 Parçası 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