Tahmine dayalı geri animasyonlar için destek eklendi

Sistem geri API'lerini kullanırken uygulama içi animasyonlar almayı ve özel geçişleri desteklemeyi etkinleştirebilirsiniz.

Video: Tahmine dayalı geri sayım animasyonları

Bu özellik etkinleştirildikten sonra uygulamanızda ana sayfaya dönüş, etkinlikler ve görevler arası etkinlikler için animasyonlar gösterilir.

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'da malzeme bileşen geliştirici kılavuzuna bakın.

Bu videoda, Android Ayarları uygulaması kullanılarak çapraz etkinlik ve ana sayfaya dönüş için tahmine dayalı geri animasyonlara dair kısa bir örnek gösteriliyor.

  1. Kullanıcı animasyonda, önceki ayarlar ekranına dönmek için ekranı geri kaydırıyor. Bu ekran, etkinlikler arası animasyona örnek olarak gösterilebilir.
  2. Kullanıcı artık önceki ekranda ikinci bir kez geri kaydırmaya başlıyor ve ana ekranın duvar kağıdıyla birlikte önizlemesini gösteriyor. Bu önizleme, ana ekrana dönüş animasyonuna bir örnektir.
  3. Kullanıcı sağa kaydırmaya devam eder ve pencerenin küçülen animasyonunu ana ekrandaki simgeye kadar gösterir.
  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

Tahmine dayalı geri hareketlerini kullanarak özel uygulama içi mülk animasyonları ve geçişleri, özel etkinlikler arası animasyonlar ve özel çapraz bölü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'te, kullanıcı geri kaydırırken nesneleri canlandıracak 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, ancak OnBackAnimationCallback arayüzünde Android 14 Geliştirici Önizlemesi 1 ve sonraki sürümlerde test edilebilecek benzer platform API'leri de bulunur.

AndroidX Transitions ile İlerleme API'lerini kullanma

Progress API'leri, Android 14 ve sonraki sürümlerde AndroidX Transitions 1.5.0-alpha01 veya sonraki sürümlerle birlikte Tahmine Dayalı Geri Geçiş geçişleri oluşturmak için 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. Kullanıcının ne kadar geri kaydırdığını gösteren currentFraction ile BackEvent.progress arasında bir tarih belirleyerek 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'de OnBackPressedCallback ile uygulanmış iki kutu arasında özel bir geçiş gösterilmektedir:

    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şleriyle desteklenmez. Çerçeve geçişlerinden uzaklaşmanızı öneririz.
  • Tahmine dayalı geri geçişler, 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 Tahmine Dayalı Geri'yi desteklediğinden emin olmak için overridePendingTransition yerine overrideActivityTransition kullanabilirsiniz. Bu, kullanıcı hızlıca 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ını aşağıdaki şekilde işler:

  • B Etkinliği'nin onCreate yöntemindeki 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 dönmek için ekranı kaydırdığında OVERRIDE_TRANSITION_CLOSE işlevini kullanın.
  • OVERRIDE_TRANSITION_CLOSE belirtilirken, enterAnim A Etkinliği'nin giriş animasyonu, exitAnim ise 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, animatör veya Androidx geçişlerinizi hareketle değiştirmek için ekranın kenarından kaydırmanıza olanak tanır. Hareketi bir eşiğin üzerine taşımanız, işlemin tamamlanıp önceki parçaya geri dönüp dönmeyeceğinizi veya iptal edilip geçerli parçada kalıp kalmayacağınızı belirler. Daha fazla bilgi için Animasyonları kullanarak parçalar arasında gezinme konusuna bakın.

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

  • Geçişler 1.5.0 veya sonraki sürümleri ve Parçalar 1.7.0 veya sonraki sürümleri içe aktarın. Parçalar'daki tahmine dayalı geri desteğinin çoğu, Geçişlerin animasyonları arama özelliğine dayanır. Bu da yalnızca 1.5.0 veya sonraki sürümlerde kullanılabilir.
  • Arka yığını yönetmek için FragmentManager veya gezinme bileşeni ile Parçalar kullanın. Kendi arka yığınınızı yönetiyorsanız Tahmine Dayalı Geri desteklenmez.
  • Bazı kitaplıklarda Tahmine Dayalı Geri Dönme desteği bulunur. Emin olmak için belgeleri kontrol edin.
  • 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:

MaterialFadeThrough, MaterialSharedAxis ve MaterialFade dahil olmak üzere bazı materyal hareketler 1.12.02-alfa02 veya daha sonraki bir tarihten itibaren tahmin özelliğini destekler. MaterialContainerTransform öğesinin tahmine dayalı geri almayı desteklemediğini unutmayın.

Geri çağırmaları kullan

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

Daha fazla bilgi için GitHub'da kod örneğine bakı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 gereklilikleriyle ilgilidir.

Kategori Animasyonlar 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 Animasyonlar 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