إنشاء صورة متحركة انتقالية مخصصة

تتيح لك عملية الانتقال المخصصة إنشاء صورة متحركة لا تتوفر من أي من فئات الانتقال المضمنة. على سبيل المثال، يمكنك تحديد عملية انتقال مخصّصة تحول لون المقدمة لحقول الإدخال والنص إلى اللون الرمادي للإشارة إلى أنّ الحقول قد تم إيقافها في الشاشة الجديدة. يساعد هذا النوع من التغيير المستخدمين في الاطّلاع على الحقول التي أوقفتها.

يطبق الانتقال المخصص، مثل أحد أنواع الانتقال المضمنة، الرسوم المتحركة على طرق العرض الفرعية لكل من مشهد البداية والنهاية. ومع ذلك، على عكس أنواع الانتقالات المضمنة، يجب عليك تقديم التعليمة البرمجية التي تلتقط قيم الخصائص وتنشئ الرسوم المتحركة. يمكنك أيضًا تحديد مجموعة فرعية من طرق العرض المستهدفة للصور المتحركة.

تعلّمك هذه الصفحة كيفية الحصول على قيم الخصائص وإنشاء رسوم متحركة لإنشاء انتقالات مخصصة.

تمديد فئة النقل

لإنشاء عملية انتقال مخصّصة، أضِف فئة إلى مشروعك تعمل على تمديد فئة 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) {}
}

توضّح الأقسام التالية كيفية إلغاء هذه الدوال.

الحصول على قيم خصائص الملف الشخصي

تستخدِم الصور المتحركة في الانتقالات نظام الصور المتحركة للخصائص والموضّح في نظرة عامة على الصور المتحركة في الموقع. تُغير الرسوم المتحركة الخاصة بالموقع خاصية الملف الشخصي من قيمة بداية إلى قيمة منتهية خلال فترة زمنية محددة، لذلك يحتاج إطار العمل إلى قيم البداية والنهاية للخاصية حتى يتمكن من إنشاء الحركة.

ومع ذلك، تحتاج عادةً الصور المتحركة للخاصية إلى مجموعة فرعية صغيرة فقط من جميع قيم موقع الملف الشخصي. على سبيل المثال، تحتاج الرسوم المتحركة الملونة إلى قيم خاصية اللون، بينما تحتاج الرسوم المتحركة للحركة إلى قيم خاصية الموضع. نظرًا لأن قيم الخصائص المطلوبة للرسم المتحرك تكون خاصة بعملية انتقالية، فإن إطار عمل الانتقالات لا يوفر كل قيمة خاصية للانتقال. وبدلاً من ذلك، يستدعي إطار العمل دوال استدعاء تسمح للانتقال بالتقاط قيم الخصائص التي يحتاج إليها فقط وتخزينها في إطار العمل.

التقاط القيم الأولية

لتمرير قيم عرض البداية إلى إطار العمل، نفِّذ الدالة captureStartValues(transitionValues). يستدعي إطار العمل هذه الدالة لكل طريقة عرض في مشهد البداية. ووسيطة الدالة هي كائن 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());
    }
    ...
}

الحصول على قيم النهاية

يستدعي إطار العمل الدالة 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(). عندما يستدعي إطار العمل هذه الدالة، يتم عرضها في العرض الجذري للمشهد وكائنات TransitionValues التي تحتوي على قيمتَي البداية والنهاية التي التقطتها.

ويعتمد عدد مرّات استدعاء إطار العمل للدالة createAnimator() على التغييرات التي تحدث بين مشهد البداية والنهاية.

على سبيل المثال، ضع في اعتبارك أن الرسوم المتحركة التلاشية أو التلاشي التي تم تنفيذها كانتقال مخصص. إذا كان مشهد البداية يحتوي على خمسة أهداف، تمت إزالة اثنان منها من مشهد النهاية، ومشهد النهاية يتضمن الأهداف الثلاثة من مشهد البداية بالإضافة إلى هدف جديد، في هذه الحالة يطلب إطار العمل createAnimator() ست مرات. وتؤدي ثلاث طلبات إلى إضفاء الحيوية على اختفاء تدريجي وتلاشي الأهداف التي تبقى في كائني المشهد. تعمل مكالمتان أخريان على تنشيط تلاشي الأهداف التي تمت إزالتها من مشهد النهاية. أحد الاستدعاءات يؤدي إلى تحريك تلاشي الهدف الجديد في مشهد النهاية.

بالنسبة إلى طرق العرض المستهدَفة المتوفّرة في كلّ من مشهدَي البداية والنهاية، يوفّر إطار العمل كائن TransitionValues لكلّ من الوسيطَين startValues وendValues. بالنسبة إلى طرق العرض المستهدَفة التي لا تتوفّر إلا في مشهد البداية أو النهاية، يوفّر إطار العمل كائن TransitionValues للوسيطة المقابلة وnull للوسيطة الأخرى.

لتنفيذ الدالة createAnimator(ViewGroup, TransitionValues, TransitionValues) عند إنشاء عملية انتقال مخصّصة، استخدِم قيم خاصية الملف الشخصي التي التقطتها لإنشاء كائن Animator وإعادته إلى إطار العمل. للحصول على مثال لعملية التنفيذ، اطّلِع على الفئة ChangeColor في نموذج CustomTransition. لمزيد من المعلومات حول أدوات الصور المتحركة للخصائص، يُرجى الاطّلاع على حركة الموقع.

تطبيق عملية نقل مخصَّصة

تعمل الانتقالات المخصّصة بنفس طريقة عمل الانتقالات المضمَّنة. يمكنك تطبيق عملية نقل مخصصة باستخدام مدير عمليات نقل، كما هو موضح في تطبيق عملية نقل.