יצירה של אנימציית מעבר בהתאמה אישית

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

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

בדף הזה מוסבר איך לתעד את ערכי הנכסים וליצור אנימציות ליצירה מעברים בהתאמה אישית.

מרחיבים את מחלקת המעבר

כדי ליצור מעבר מותאם אישית, צריך להוסיף לפרויקט מחלקה שמרחיבים את המחלקה Transition ולשנות את הפונקציות שמוצגות בקטע הקוד הבא:

Kotlin

class CustomTransition : Transition() {

    override fun captureStartValues(transitionValues: TransitionValues) {}

    override fun captureEndValues(transitionValues: TransitionValues) {}

    override fun createAnimator(
        sceneRoot: ViewGroup,
        startValues: TransitionValues?,
        endValues: TransitionValues?
    ): Animator? {}

}

Java

public class CustomTransition extends Transition {

    @Override
    public void captureStartValues(TransitionValues values) {}

    @Override
    public void captureEndValues(TransitionValues values) {}

    @Override
    public Animator createAnimator(ViewGroup sceneRoot,
                                   TransitionValues startValues,
                                   TransitionValues endValues) {}
}

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

תיעוד ערכי הנכסים בתצוגה

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

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

תיעוד הערכים ההתחלתיים

כדי להעביר ל-framework את הערכים של תצוגת ההתחלה, צריך להטמיע את captureStartValues(transitionValues) מותאמת אישית. תוכנת ה-framework מפעילה את הפונקציה הזו לכל תצוגה בסצנת ההתחלה. הפונקציה ארגומנט הוא אובייקט TransitionValues שמכיל הפניה לתצוגה המפורטת ולמופע Map שבו תוכלו לשמור את ערכי התצוגה רוצה. בהטמעה, מאחזרים את ערכי המאפיין ומחזירים אותם על ידי אחסונו במפה.

כדי לוודא שהמפתח של ערך הנכס לא מתנגש עם TransitionValues מפתחות, צריך להשתמש בסכמת השמות הבאה:

package_name:transition_name:property_name

בקטע הקוד הבא מוצג מימוש של הפונקציה captureStartValues():

Kotlin

class CustomTransition : Transition() {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"

    override fun captureStartValues(transitionValues: TransitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues)
    }

    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private fun captureValues(transitionValues: TransitionValues) {
        // Get a reference to the view
        val view = transitionValues.view
        // Store its background property in the values map
        transitionValues.values[PROPNAME_BACKGROUND] = view.background
    }

    ...

}

Java

public class CustomTransition extends Transition {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private static final String PROPNAME_BACKGROUND =
            "com.example.android.customtransition:CustomTransition:background";

    @Override
    public void captureStartValues(TransitionValues transitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues);
    }


    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private void captureValues(TransitionValues transitionValues) {
        // Get a reference to the view
        View view = transitionValues.view;
        // Store its background property in the values map
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    ...
}

תיעוד ערכים סופיים

ה-framework מפעיל את הפונקציה captureEndValues(TransitionValues) פעם אחת לכל צפייה ביעד בסצנת הסיום. בכל שאר הבחינות, captureEndValues() פועל באותו אופן כמו captureStartValues().

בקטע הקוד הבא מוצג מימוש של הפונקציה captureEndValues():

Kotlin

override fun captureEndValues(transitionValues: TransitionValues) {
    captureValues(transitionValues)
}

Java

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

בדוגמה הזו, גם captureStartValues() וגם captureEndValues() הפונקציות מפעילות את captureValues() כדי לאחזר ולאחסן ערכים. המאפיין של תצוגה מפורטת שהמאחזר captureValues() זהה, אבל יש לו ערכים שונים סצנות ההתחלה והסיום. במסגרת המערכת שומרת מפות נפרדות להתחלה ולסיום במצב של תצוגה.

יצירת אנימטור בהתאמה אישית

כדי להוסיף אנימציה לשינויים בתצוגה בין המצב בסצנת ההתחלה לבין המצב שלה את סצנת הסיום, הוסיפו אנימטור createAnimator() מותאמת אישית. כשה-framework קורא לפונקציה הזו, היא עוברת בתצוגת הרמה הבסיסית (root) של הסצנה TransitionValues אובייקטים שמכילים את ערכי ההתחלה והסיום שצילמתם.

מספר הפעמים שה-framework קורא לפונקציה createAnimator() תלוי שינויים שמתרחשים בין סצינת ההתחלה והסיום.

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

בתצוגות יעד שקיימות גם בסצנת ההתחלה וגם בסצינת הסיום, המסגרת מספקת אובייקט TransitionValues גם ל-startValues וגם ל- endValues ארגומנטים. לתצוגות יעד שקיימות רק בהתחלה או הסצנה האחרונה, ה-framework מספק אובייקט TransitionValues לארגומנט התואם ול-null בשביל השני.

כדי להטמיע את הפונקציה createAnimator(ViewGroup, TransitionValues, TransitionValues) כשיוצרים את מעבר בהתאמה אישית, משתמשים בערכי המאפיינים של התצוגה המפורטת שתיעדתם כדי ליצור אובייקט Animator ולהחזיר אותו ל-framework. לצורך הטמעה לדוגמה, לראות את הכיתה ChangeColor ב דוגמה של מעבר מותאם אישית. לקבלת מידע נוסף על אנימטורים של נדל"ן, ראו אנימציה של נכס.

החלת מעבר בהתאמה אישית

מעברים בהתאמה אישית פועלים בדיוק כמו מעברים מובנים. אפשר להחיל מעבר בהתאמה אישית באמצעות מנהל מעבר, כפי שמתואר במאמר החלת מעבר.