افزودن پشتیبانی از پویانمایی‌های اشاره برگشت پیش‌گویانه در «نماها»

می‌توانید بااستفاده از «نماها» یا Compose، پویانمایی‌ها و انتقال‌های سفارشی برای ویژگی‌های درون‌برنامه، پویانمایی‌های سفارشی برای بین فعالیت‌ها، و پویانمایی‌های سفارشی برای بین قطعه‌ها با اشاره‌های برگشت پیش‌گویانه ایجاد کنید. برای امتحان کردن روش Compose، افزودن پشتیبانی از پویانمایی‌های اشاره برگشت پیش‌گویانه را ببینید.

افزودن گذرهای سفارشی بااستفاده از Progress API

با AndroidX Activity نسخه 1.8.0-alpha01 یا بالاتر، می‌توانید از میاناهای برنامه‌سازی کاربردی «پیشرفت برگشت پیش‌گویانه» برای توسعه پویانمایی‌های سفارشی برای اشاره برگشت پیش‌گویانه در برنامه‌تان استفاده کنید. میاناهای برنامه‌سازی کاربردی «پیشرفت» برای پویانمایی کردن نماها مفید هستند اما هنگام پویانمایی کردن گذارها بین قطعه‌ها محدودیت‌هایی دارند. در OnBackPressedCallback روش‌های handleOnBackProgressed، handleOnBackCancelled و handleOnBackStarted را برای پویانمایی کردن اشیا هنگام تند کشیدن کاربر به عقب معرفی کرده‌ایم. اگر لازم است بیشتر از پویانمایی‌های پیش‌فرض ارائه‌شده توسط سیستم یا پویانمایی‌های Material Component سفارشی‌سازی کنید، از این روش‌ها استفاده کنید.

انتظار داریم اکثر برنامه‌ها از میاناهای برنامه‌سازی کاربردی AndroidX سازگار با نسخه قدیمی استفاده کنند، اما میاناهای برنامه‌سازی کاربردی پلاتفرم مشابهی نیز در واسط OnBackAnimationCallback وجود دارد که برای آزمایش در Android 14 و نسخه‌های بالاتر دردسترس است.

استفاده از میاناهای برنامه‌سازی کاربردی Progress با AndroidX Transitions

از Progress API می‌توان با AndroidX Transitions نسخه 1.5.0-alpha01 یا بالاتر در Android 14 و بالاتر برای ایجاد انتقال‌های «بازگشت پیش‌بینانه» استفاده کرد.

  1. از TransitionManager#controlDelayedTransition به‌جای beginDelayedTransition برای پخش انتقال‌ها هنگام تند کشیدن کاربر به عقب استفاده کنید.
  2. گذار را در handleOnBackStarted ایجاد کنید.
  3. Play the transition with the back event within handleOnBackProgressed by relating currentFraction to BackEvent.progress which exposes how far the user has swiped back.
  4. پس‌از اینکه کاربر اشاره برگشت را در handleOnBackPressed انجام داد، گذار را تمام کنید.
  5. درنهایت، وضعیت انتقال را در handleOnBackCancelled بازنشانی کنید.

ویدیو، کد Kotlin، و XML زیر یک انتقال سفارشی بین دو جعبه را که با OnBackPressedCallback پیاده‌سازی شده است نشان می‌دهد:

    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>

هنگام کار با انتقال‌های «برگشت پیش‌گویانه»، موارد زیر را درنظر داشته باشید:

  • از isSeekingSupported استفاده کنید تا بررسی کنید آیا انتقال از «بازگشت پیش‌بینانه» پشتیبانی می‌کند یا نه.
  • isSeekingSupported را لغو کنید تا برای انتقال‌های سفارشی‌تان مقدار درست برگردانده شود.
  • برای هر پویانمایی یک کنترل‌کننده ایجاد کنید.
  • انتقال‌های «بازگشت پیش‌بینی‌کننده» با انتقال‌های AndroidX پشتیبانی می‌شود، اما با انتقال‌های چارچوب پشتیبانی نمی‌شود. از انتقال‌های چارچوب مهاجرت کنید و به‌جای آن از Animator و انتقال‌های AndroidX استفاده کنید.
  • انتقال‌های «بازگشت پیش‌بینی‌کننده» در دستگاه‌های دارای Android نسخه ۱۴ و بالاتر پشتیبانی می‌شود و با نسخه‌های قدیمی سازگار نیست.
  • از گذارهایی که با صحنه‌های XML ایجاد شده‌اند نیز پشتیبانی می‌شود. در handleOnBackStarted،‏ TransitionSeekController را به‌جای نتیجه controlDelayedTransition، روی نتیجه TransitionManager.createSeekController تنظیم کنید.

منابع تکمیلی