پشتیبانی از انیمیشن‌های پیش‌بینی‌کننده‌ی بازگشت به عقب در Views اضافه شد.

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

اضافه کردن انتقال‌های سفارشی با استفاده از Progress API

با AndroidX Activity 1.8.0-alpha01 یا بالاتر، می‌توانید از APIهای Predictive Back Progress برای توسعه انیمیشن‌های سفارشی برای ژست پیش‌بینی‌کننده بازگشت در برنامه خود استفاده کنید. APIهای Progress در متحرک‌سازی نماها مفید هستند، اما هنگام متحرک‌سازی انتقال بین قطعات، محدودیت‌هایی دارند. در OnBackPressedCallback متدهای handleOnBackProgressed ، handleOnBackCancelled و handleOnBackStarted را برای متحرک‌سازی اشیاء در حین کشیدن انگشت کاربر به عقب معرفی کرده‌ایم. اگر نیاز به سفارشی‌سازی بیش از انیمیشن‌های پیش‌فرض ارائه شده توسط سیستم یا انیمیشن‌های کامپوننت متریال دارید، از این متدها استفاده کنید.

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

استفاده از APIهای پیشرفت با AndroidX Transitions

APIهای Progress می‌توانند با AndroidX Transitions 1.5.0-alpha01 یا بالاتر در اندروید ۱۴ و بالاتر برای ایجاد گذارهای Predictive Back استفاده شوند.

  1. برای پخش انتقال‌ها هنگام کشیدن انگشت کاربر به عقب، به جای beginDelayedTransition TransitionManager#controlDelayedTransition استفاده کنید.
  2. انتقال را درون handleOnBackStarted ایجاد کنید.
  3. با مرتبط کردن currentFraction به BackEvent.progress که میزان حرکت کاربر به عقب را نشان می‌دهد، انتقال را با رویداد back درون handleOnBackProgressed اجرا کنید.
  4. پس از اینکه کاربر حرکت برگشت را در handleOnBackPressed انجام داد، انتقال را پایان دهید.
  5. در نهایت، وضعیت انتقال را درون handleOnBackCancelled بازنشانی کنید.

ویدیوی زیر، کد کاتلین و 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>

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

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

منابع اضافی