یک انیمیشن انتقال سفارشی ایجاد کنید

یک انتقال سفارشی به شما امکان می‌دهد انیمیشنی ایجاد کنید که از هیچ یک از کلاس‌های انتقال داخلی موجود نیست. برای مثال، می‌توانید یک انتقال سفارشی تعریف کنید که رنگ پیش‌زمینه متن و فیلدهای ورودی را به خاکستری تبدیل می‌کند تا نشان دهد که فیلدها در صفحه جدید غیرفعال هستند. این نوع تغییر به کاربران کمک می کند تا فیلدهایی را که غیرفعال کرده اید ببینند.

یک انتقال سفارشی، مانند یکی از انواع انتقال داخلی، انیمیشن ها را برای نماهای کودک از هر دو صحنه شروع و پایان اعمال می کند. با این حال، بر خلاف انواع انتقال داخلی، شما باید کدی را ارائه دهید که مقادیر ویژگی را گرفته و انیمیشن تولید کند. همچنین ممکن است بخواهید زیرمجموعه ای از نماهای هدف را برای انیمیشن خود تعریف کنید.

این صفحه به شما می آموزد که چگونه مقادیر ویژگی را بگیرید و انیمیشن هایی را برای ایجاد انتقال های سفارشی ایجاد کنید.

کلاس Transition را گسترش دهید

برای ایجاد یک انتقال سفارشی، یک کلاس به پروژه خود اضافه کنید که کلاس Transition را گسترش دهد و توابع نشان داده شده در قطعه زیر را لغو کند:

کاتلین

class CustomTransition : Transition() {

    override fun captureStartValues(transitionValues: TransitionValues) {}

    override fun captureEndValues(transitionValues: TransitionValues) {}

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

}

جاوا

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) {}
}

بخش‌های زیر نحوه لغو این توابع را توضیح می‌دهند.

گرفتن مقادیر ویژگی view

انیمیشن های انتقالی از سیستم انیمیشن ویژگی که در نمای کلی انیمیشن Property توضیح داده شده است استفاده می کنند. انیمیشن های Property یک ویژگی view را از یک مقدار شروع به یک مقدار پایانی در یک دوره زمانی مشخص تغییر می دهند، بنابراین چارچوب باید هر دو مقدار شروع و پایان ویژگی را برای ساخت انیمیشن داشته باشد.

با این حال، یک انیمیشن ویژگی معمولاً فقط به یک زیرمجموعه کوچک از تمام مقادیر ویژگی های view نیاز دارد. به عنوان مثال، یک انیمیشن رنگی به مقادیر ویژگی رنگ نیاز دارد، در حالی که یک انیمیشن حرکتی به مقادیر ویژگی موقعیت نیاز دارد. از آنجایی که مقادیر ویژگی های مورد نیاز برای یک انیمیشن مختص یک انتقال است، چارچوب ترانزیشن ها هر مقدار ویژگی را برای یک انتقال ارائه نمی کند. در عوض، فریم‌ورک توابع برگشت تماس را فراخوانی می‌کند که به یک انتقال اجازه می‌دهد فقط مقادیر ویژگی‌های مورد نیاز خود را بگیرد و آنها را در چارچوب ذخیره کند.

گرفتن مقادیر شروع

برای ارسال مقادیر نمای شروع به چارچوب، تابع captureStartValues(transitionValues) را پیاده سازی کنید. چارچوب این تابع را برای هر نما در صحنه شروع فراخوانی می کند. آرگومان تابع یک شی TransitionValues ​​است که حاوی یک مرجع به view و یک نمونه Map است که در آن می توانید مقادیر view مورد نظر خود را ذخیره کنید. در پیاده سازی خود، این مقادیر ویژگی را بازیابی کنید و با ذخیره آنها در نقشه، آنها را به فریمورک برگردانید.

برای اطمینان از اینکه کلید مقدار خاصیت با سایر کلیدهای TransitionValues ​​مغایرت ندارد، از طرح نامگذاری زیر استفاده کنید:

package_name:transition_name:property_name

قطعه زیر پیاده سازی تابع captureStartValues() را نشان می دهد:

کاتلین

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
    }

    ...

}

جاوا

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() را نشان می دهد:

کاتلین

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

جاوا

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

در این مثال، هر دو تابع captureStartValues() و captureEndValues() برای بازیابی و ذخیره مقادیر captureValues() فراخوانی می کنند. ویژگی view که captureValues() بازیابی می کند یکسان است، اما مقادیر متفاوتی در صحنه های شروع و پایان دارد. چارچوب نقشه‌های جداگانه‌ای را برای حالت‌های شروع و پایان یک نما نگه می‌دارد.

یک انیماتور سفارشی ایجاد کنید

برای متحرک سازی تغییرات یک نما بین حالت آن در صحنه شروع و حالت آن در صحنه پایانی، با نادیده گرفتن تابع createAnimator() یک انیماتور تهیه کنید. وقتی فریم ورک این تابع را فراخوانی می کند، در نمای ریشه صحنه و اشیاء TransitionValues ​​که حاوی مقادیر شروع و پایانی هستند که شما گرفته اید، عبور می کند.

تعداد دفعاتی که فریم ورک تابع createAnimator() فرا می خواند به تغییراتی که بین صحنه های شروع و پایان رخ می دهد بستگی دارد.

به عنوان مثال، یک انیمیشن محو یا محو شده را به عنوان یک انتقال سفارشی در نظر بگیرید. اگر صحنه شروع دارای پنج هدف باشد که دو مورد از آنها از صحنه پایانی حذف شده و صحنه پایانی دارای سه هدف از صحنه شروع به اضافه یک هدف جدید باشد، آنگاه چارچوب createAnimator() شش بار فراخوانی می کند. سه مورد از تماس‌ها، محو شدن و محو شدن اهدافی را که در هر دو شی صحنه باقی می‌مانند، متحرک می‌کنند. دو تماس دیگر محو شدن اهداف حذف شده از صحنه پایانی را متحرک می کند. یک تماس، محو شدن هدف جدید را در صحنه پایانی متحرک می کند.

برای نماهای هدف که در هر دو صحنه شروع و پایان وجود دارند، چارچوب یک شی TransitionValues ​​را برای هر دو آرگومان startValues ​​و endValues ​​ارائه می دهد. برای نماهای هدف که فقط در صحنه شروع یا پایان وجود دارند، چارچوب یک شی TransitionValues ​​برای آرگومان مربوطه و null برای آرگومان دیگر ارائه می دهد.

برای پیاده‌سازی تابع createAnimator(ViewGroup, TransitionValues, TransitionValues) هنگام ایجاد یک انتقال سفارشی، از مقادیر ویژگی view که گرفته‌اید برای ایجاد یک شی Animator و برگرداندن آن به چارچوب استفاده کنید. برای اجرای نمونه، کلاس ChangeColor را در نمونه CustomTransition ببینید. برای اطلاعات بیشتر در مورد انیماتورهای دارایی، به انیمیشن Property مراجعه کنید.

یک انتقال سفارشی را اعمال کنید

انتقال های سفارشی مانند انتقال های داخلی کار می کنند. همانطور که در Apply a Transition توضیح داده شده است، می توانید یک انتقال سفارشی را با استفاده از یک مدیر انتقال اعمال کنید.