شما میتوانید با استفاده از 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 استفاده شوند.
- برای پخش انتقالها هنگام کشیدن انگشت کاربر به عقب، به جای
beginDelayedTransitionTransitionManager#controlDelayedTransitionاستفاده کنید. - انتقال را درون
handleOnBackStartedایجاد کنید. - با مرتبط کردن
currentFractionبهBackEvent.progressکه میزان حرکت کاربر به عقب را نشان میدهد، انتقال را با رویداد back درونhandleOnBackProgressedاجرا کنید. - پس از اینکه کاربر حرکت برگشت را در
handleOnBackPressedانجام داد، انتقال را پایان دهید. - در نهایت، وضعیت انتقال را درون
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تنظیم کنید.
منابع اضافی
- نمونههای کد برگشتی پیشبینیکننده
- اصول اولیه برای فیلمبرداری از پشت سیستم
- ساختن برای آیندهی ویدیوی اندروید