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

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

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

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

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

لإنشاء انتقال مخصص، يمكنك إضافة فئة إلى مشروعك تعمل على توسيع فئة 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 في نموذج CustomTransit. لمزيد من المعلومات عن مصممي العقارات، راجع حركة الموقع:

تطبيق انتقال مخصص

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