הוספת תמיכה באנימציות מובנות ובאנימציות בהתאמה אישית של תנועת החזרה חזוי

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

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

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

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

אפשר גם לשדרג את התלות ברכיבי Material לגרסה 1.10.0 של MDC ל-Android כדי לקבל אנימציות של רכיבי Material, כמו:

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

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

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

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

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

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

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

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

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

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

ניתן להשתמש בממשקי Progress API עם AndroidX Transitions מגרסה 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 כדי לבדוק אם המעבר תומך בחזרה חזויה.
  • משנים את הערך של isSeekingSupported כדי להחזיר את הערך true למעברים בהתאמה אישית.
  • יצירת בקר אחד לכל אנימציה.
  • אפשר להשתמש במעברים חזויים אחורה במעברים של AndroidX, אבל לא במעברים של מסגרת. מומלץ להפסיק להשתמש במעברים של מסגרות.
  • העברות חזויות חזרה נתמכות במכשירי 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 היא אנימציית היציאה של פעילות ב'.