添加对内置和自定义预测性返回动画的支持

אם כבר העברתם את האפליקציה לממשקי ה-API החדשים לגרסה החדשה, אפשר הבעת הסכמה לקבלת חיזוי חזרה לאפליקציה באופן אוטומטי אנימציות, וגם תמיכה במעברים מותאמים אישית.

הוספת תמיכה באנימציות מובנות בתוך האפליקציה

סרטון: אנימציות חזויות של החזרה

לאחר הבעת ההסכמה, האפליקציה תציג אנימציות של החזרה הביתה, פעילות צולבת, ובין משימות שונות.

ניתן גם לשדרג את התלות של רכיבי החומר המילוליים לגרסה 1.10.0 של MDC Android לקבלת אנימציות של רכיבים מהותיים כמו:

מידע נוסף זמין בהנחיות למפתחים של רכיבי חומר ב-GitHub מידע.

הסרטון מציג דוגמה קצרה לאנימציות אחורה של 'חזרה' פעילות שונות וחזרה הביתה באמצעות האפליקציה 'הגדרות' של Android.

  1. באנימציה, המשתמש מחליק בחזרה כדי לחזור להגדרות הקודמות המסך - דוגמה לאנימציה של פעילות צולבת.
  2. עכשיו במסך הקודם, המשתמש מתחיל להחליק אחורה פעם שנייה. הצגת תצוגה מקדימה של מסך הבית עם הטפט שלו - דוגמה את האנימציה של החזרה לבית.
  3. המשתמש ממשיך להחליק ימינה ומוצג אנימציה של החלון מתכווץ לסמל במסך הבית.
  4. המשתמש חזר במלואו למסך הבית.

מידע נוסף על תמיכה בחיזוי חזרה.

הוספה של מעברים ואנימציות בהתאמה אישית בתוך האפליקציה

אפשר ליצור אנימציות ומעברים מותאמים אישית של נכס מתוך האפליקציה באמצעות Progress API ושיטה מותאמת אישית לאנימציות של פעילויות שונות overrideActivityTransition

הוספת מעברים בהתאמה אישית באמצעות Progress API

עם פעילות AndroidX מגרסה 1.8.0-alpha01 ואילך, ניתן להשתמש במנגנון החיזוי התקדמות ממשקי API לפיתוח אנימציות מותאמות אישית תנועת החזרה החזויה באפליקציה. בטווח של OnBackPressedCallback הצגנו את handleOnBackProgressed, handleOnBackCancelled שיטות handleOnBackStarted להנפשה של אובייקטים בזמן שהמשתמש מחליק בחזרה. כדאי להשתמש את השיטות האלה אם צריכים משהו מותאם אישית יותר מאנימציות ברירת המחדל שסופקו על ידי אנימציית המערכת החדשה או באמצעות האנימציות מסוג Material Component.

אנחנו מצפים שרוב האפליקציות ישתמשו בממשקי API של AndroidX בתאימות לאחור, אבל יש גם ממשקי API של פלטפורמות דומות OnBackAnimationCallback ממשק זמין לבדיקה ב-Android 14 Developer Preview גרסה 1 ואילך.

שימוש בממשקי Progress API עם מעברים של AndroidX

ניתן להשתמש בממשקי Progress API עם AndroidX Transits מגרסה 1.5.0-alpha01 ואילך ב-Android מגרסה 14 ואילך כדי ליצור העברות חזויות חזרה.

  1. במקום להשתמש ב-TransitionManager#controlDelayedTransition beginDelayedTransition למשחק המעברים בתור המשתמש מחליק בחזרה.
  2. יוצרים את המעבר בתוך handleOnBackStarted.
  3. מפעילים את המעבר עם אירוע 'הקודם' שמתקיים בתוך handleOnBackProgressed עד בקשר ל-currentFraction אל BackEvent.progress, שחושף את המרחק המשתמש החליף בחזרה.
  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 כדי לבדוק אם המעבר תומך ב'חזרה חזויה'.
  • כדי להחזיר את הערך True להעברות בהתאמה אישית צריך לשנות את isSeekingSupported.
  • יצירת בקר אחד לכל אנימציה.
  • מעברי חזרה חזויים נתמכים עם מעברים מ-AndroidX, אבל לא במסגרת מעברים בין מסגרות. מומלץ לבצע מיגרציה מ-framework מעברים שונים.
  • העברות חזויות חזרה נתמכות במכשירי Android 14 ואילך לא תואמת לאחור.
  • יש תמיכה גם במעברים שנוצרו באמצעות סצנות XML. לחשבון handleOnBackStarted, הגדרת TransitionSeekController כתוצאה של TransitionManager.createSeekController במקום התוצאה של controlDelayedTransition.

הוספת מעברים בין פעילויות בהתאמה אישית ב-Android 14 ואילך

כדי להבטיח שמעברים של פעילויות בהתאמה אישית יתמכו בהצגת חיזויים ב-Android 14 ומעלה, אתם יכולים להשתמש ב-overrideActivityTransition overridePendingTransition כלומר אנימציית המעבר תפעל המשתמש מחליק בחזרה.

כדי להמחיש איך זה יכול לקרות, נבחן תרחיש שבו פעילות ב' נמצאת מעל פעילות א' במקבץ האחורי. צריך לטפל בהתאמה אישית את האנימציות של הפעילות באופן הבא:

  • קריאה לפתיחה או לסגירה של מעברים בתוך onCreate של פעילות ב' .
  • כשהמשתמש מנווט לפעילות ב', יש להשתמש ב-OVERRIDE_TRANSITION_OPEN. מתי המשתמש מחליק כדי לחזור לפעילות א', השתמשו OVERRIDE_TRANSITION_CLOSE
  • כשמציינים את הערך OVERRIDE_TRANSITION_CLOSE, הערך enterAnim הוא הערך של פעילות א' כניסה לאנימציה, והexitAnim הוא אנימציית היציאה של פעילות ב'.