يُعد نظام الرسوم المتحركة للخصائص إطارًا قويًا يسمح لك لتحريك أي شيء تقريبًا. يمكنك تحديد رسم متحرك لتغيير أي خاصية كائن بمرور الوقت، بغض النظر عما إذا كان يجذب الشاشة أم لا. تغيّر الصورة المتحركة للخصائص (حقل في كائن) خلال مدة زمنية محددة. لتحريك شيء ما، يجب تحديد خاصية الكائن التي تريد تحريكها، مثل موضع العنصر على الشاشة، والمدة التي تريد إضافة تأثيرات حركية إليها، والقيم التي تريد إضافة تأثيرات حركية إليها.
يتيح لك نظام الرسوم المتحركة للخصائص تحديد الخصائص التالية الرسوم المتحركة:
- المدة: يمكنك تحديد مدة التأثير. المدة التلقائية هي 300 ملي ثانية.
- استقراء الوقت: يمكنك تحديد كيفية احتساب قيم الخاصية كـ دالة الوقت المنقضي الحالي للرسم المتحرك.
- عدد التكرارات والسلوكيات: يمكنك تحديد ما إذا كان سيتم تكرار الرسم المتحرك أم لا عند يصل إلى نهاية المدة وعدد مرات تكرار الرسم المتحرك. يمكنك أيضًا لتحديد ما إذا كنت تريد تشغيل الرسوم المتحركة عكسيًا. الضبط على وضع التشغيل العكسي الحركة للأمام ثم للخلف بشكل متكرر، حتى يتم الوصول إلى عدد التكرارات.
- مجموعات الصور المتحركة: يمكنك تجميع الرسوم المتحركة في مجموعات منطقية تعمل معًا أو بشكل تسلسلي أو بعد تأخيرات محددة.
- تأخير تحديث الإطار: يمكنك تحديد عدد مرات تحديث إطارات الصورة المتحركة. تشير رسالة الأشكال البيانية يتم تعيين الإعداد الافتراضي على التحديث كل 10 ملي ثانية، ولكن السرعة التي يمكن بها للتطبيق تحديث الإطارات هي يعتمد بشكل أساسي على مدى انشغال النظام بشكل عام وعلى مدى سرعة النظام في خدمة الموقّت الأساسي.
للاطّلاع على مثال كامل للرسم المتحرك للخصائص، راجع
صف واحد (ChangeColor
) في النقل المخصص
عينة على جيت هب.
آلية عمل الصورة المتحركة للخصائص
أولاً، دعنا نتناول كيفية عمل الرسوم المتحركة باستخدام مثال بسيط. يصور الشكل 1
كائن افتراضي يتضمّن صورة متحركة لسمته x
التي تُمثل
الموقع الأفقي على الشاشة. يتم تعيين مدة الصورة المتحركة على 40 ملي ثانية والمسافة
مسافة السفر 40 بكسل. يتم نقل العنصر كل 10 ملي ثانية، وهو معدّل إعادة تحميل اللقطات التلقائي.
أفقيًا بمقدار 10 بكسل. في نهاية 40 ملي ثانية، يتوقف الرسم المتحرك وينتهي الكائن في
الموضع الأفقي 40. هذا مثال على رسم متحرك مزود باستكمال خطي، مما يعني
يتحرك الكائن بسرعة ثابتة.
يمكنك أيضًا تحديد الرسوم المتحركة للحصول على استقراء غير خطي. يوضح الشكل 2 كائن افتراضي يتسارع في بداية الرسم المتحرك ويتباطأ في نهاية الرسوم المتحركة. لا يزال الكائن يتحرك 40 بكسل خلال 40 ملي ثانية، ولكن بشكل غير خطي. في جلسة المعمل، تبدأ هذه الحركة، تتسارع هذه الحركة حتى نقطة المنتصف ثم تقل في منتصف الطريق حتى نهاية الرسوم المتحركة. وكما يوضح الشكل 2، فإن المسافة المقطوعة في بداية ونهاية الرسوم المتحركة أقل من المنتصف.
دعونا نلقي نظرة مفصلة على كيفية تضمين المكونات المهمة لنظام الرسوم المتحركة للخصائص بحساب الرسوم المتحركة مثل تلك الموضحة أعلاه. يصور الشكل 3 كيف تؤثر الطبقات الرئيسية العمل مع بعضهم البعض.
يتتبّع الكائن ValueAnimator
توقيت الحركة،
مثل مدة تشغيل الرسوم المتحركة، والقيمة الحالية للخاصية التي
المتحركة.
يتضمّن ValueAnimator
السمة TimeInterpolator
التي تحدّد استقراء الصور المتحركة، والسمة TypeEvaluator
التي تحدّد كيفية حساب القيم الخاصة بالخاصية.
المتحركة. على سبيل المثال، في الشكل 2، سيكون TimeInterpolator
المستخدَم هو
ستكون قيمة AccelerateDecelerateInterpolator
وTypeEvaluator
هي IntEvaluator
.
لبدء صورة متحركة، أنشئ ValueAnimator
وأضِف إليها
قيم البداية والنهاية للموقع الذي تريد تحريكه، بالإضافة إلى مدة
الرسوم المتحركة. عند استدعاء "start()
" الصورة المتحركة
تبدأ. أثناء الحركة بأكملها، يحتسب ValueAnimator
الكسر المنقضي
من 0 إلى 1، بناءً على مدة الصورة المتحركة ومقدار الوقت المنقضي. تشير رسالة الأشكال البيانية
يمثل الكسر المنقضي النسبة المئوية لوقت اكتمال الرسم المتحرك، 0 يعني 0%
و1 يعني 100٪. على سبيل المثال، في الشكل 1، سيكون الكسر المنقضي عند t = 10 ملي ثانية هو .25
لأن المدة الإجمالية هي t = 40 ملي ثانية.
عند إتمام ValueAnimator
لحساب الكسر المنقضي، فإنه
بـ TimeInterpolator
المعينة حاليًا، لحساب
الكسور المستورَدة. يعيّن الكسر المستورَد الكسر المنقضي إلى عدد جديد
يراعي استقراء الوقت المحدّد. فعلى سبيل المثال، في الشكل 2،
لأن الرسوم المتحركة تتسارع ببطء، الكسر المستقراء، أي حوالي 15 .أقل من
الكسر المنقضي، .25، عند t = 10 ملي ثانية. في الشكل 1، يكون الكسر المستورَد هو نفسه دائمًا
الكسر المنقضي.
عند حساب الكسر المستورَد، يستدعي ValueAnimator
.
TypeEvaluator
المناسبة لحساب قيمة
الذي تقوم بتحريكه، بناءً على الكسر المستورَد والقيمة الأولية
نهاية الرسوم المتحركة. على سبيل المثال، في الشكل 2، كان الكسر المستورَد 0 .15 عند t =
10 ملي ثانية، وبالتالي ستكون قيمة الخاصية في ذلك الوقت 0 .15 × (40 - 0) أو 6.
أوجه الاختلاف بين حركة الملكية وحركة العرض
يوفّر نظام عرض الصور المتحركة إمكانية إضافة تأثيرات حركية إلى View
فقط.
لذا، إذا أردت إضافة تأثيرات حركية إلى كائنات غير View
، عليك تنفيذ
التعليمات البرمجية الخاصة بك للقيام بذلك. كما أن نظام عرض الرسوم المتحركة مقيد في أنه
يعرض بعض جوانب الكائن View
لتحريكه، مثل التحجيم
تدوير العرض وليس لون الخلفية مثلاً.
من العيوب الأخرى في نظام عرض الرسوم المتحركة هو أنه يقتصر فقط على تعديل تم رسم العرض، وليس العرض الفعلي نفسه. فعلى سبيل المثال، إذا قمت بتحريك زر لتحريك عبر الشاشة، يتم رسم الزر بشكل صحيح، ولكن يتم رسم الموقع الفعلي الذي يمكنك النقر فيه لا يتغير، لذلك عليك تنفيذ منطقك الخاص للتعامل مع هذا.
وباستخدام نظام الصور المتحركة للخصائص، تتم إزالة هذه القيود تمامًا، ويمكنك إضافة تأثيرات متحركة لأي خاصية لأي كائن (Views and non-Views) ويتم تعديل الكائن نفسه فعليًا. كما يعد نظام الرسوم المتحركة للخصائص أكثر قوة في طريقة تنفيذ الرسوم المتحركة. علامة @ مستوى عالٍ، يمكنك تعيين أدوات متحركة للخصائص التي تريد تحريكها، مثل اللون، أو موضعه أو حجمه ويمكنه تحديد جوانب الرسوم المتحركة مثل الاستيفاء مزامنة العديد من منشئي الصور المتحركة.
مع ذلك، يستغرق إعداد نظام عرض الصور المتحركة وقتًا أقل ويتطلب رمزًا أقل للكتابة. ما إذا كانت الصورة المتحركة لعرض الصورة المتحركة توفر كل الإجراءات المطلوبة، أو إذا كانت الرموز الحالية بالطريقة التي تريدها، ليس هناك حاجة لاستخدام نظام الرسوم المتحركة للخصائص. قد يهم أيضًا من المنطقي استخدام كلا نظامي الرسوم المتحركة في مواقف مختلفة عند ظهور حالة الاستخدام.
نظرة عامة على واجهة برمجة التطبيقات
يمكنك العثور على معظم واجهات برمجة التطبيقات لنظام صور المواقع المتحركة في android.animation
. لأنّ نظام عرض الصور المتحركة
تحدد العديد من المداخلات في اللغة android.view.animation
، يمكنك استخدام
تلك التعديلات في نظام الرسوم المتحركة للممتلكات أيضًا. تصف الجداول التالية
مكونات نظام الرسوم المتحركة للممتلكات.
توفّر الفئة Animator
البنية الأساسية للإنشاء.
والرسوم المتحركة. أنت لا تستخدم عادةً هذه الفئة مباشرةً لأنها توفر الحد الأدنى
الوظيفة التي يجب توسيعها لإتاحة القيم المتحركة بالكامل. ما يلي:
تمتد الفئات الفرعية إلى Animator
:
الفئة | الوصف |
---|---|
ValueAnimator |
محرك التوقيت الرئيسي لحركة الخاصية الذي يحسب أيضًا قيم
المطلوب تطبيق مؤثرات حركية عليها. فهو يتضمن كل الوظائف الأساسية التي تحتسب الرسوم المتحركة
ويحتوي على تفاصيل التوقيت لكل رسم متحرك، ومعلومات حول ما إذا كان
تكرار الرسوم المتحركة، والمستمعين الذين يتلقون أحداث تحديث، والقدرة على ضبط خيارات
الأنواع لتقييمها. هناك جزآن للخصائص المتحركة: حساب الخصائص المتحركة
وتعيين تلك القيم على الكائن والخاصية المتحركة. لا ينفذ "ValueAnimator " الجزء الثاني، لذا يجب الاستماع.
للاطّلاع على التعديلات على القيم المحسوبة من خلال ValueAnimator
تعديل الكائنات التي تريد تحريكها باستخدام منطقك الخاص. راجع القسم الذي يتناول
الرسوم المتحركة باستخدام ValueAnimator لمزيد من المعلومات. |
ObjectAnimator |
فئة فرعية من ValueAnimator تسمح لك بتحديد هدف
خاصية الكائن والكائن لتحريكه. تعدّل هذه الفئة السمة وفقًا لذلك في حال
يحسب قيمة جديدة للرسوم المتحركة. أنت تريد استخدام
ObjectAnimator في معظم الأوقات،
لأنه يجعل عملية تحريك القيم في الكائنات المستهدفة أسهل بكثير. ومع ذلك،
تريد أحيانًا استخدام ValueAnimator مباشرةً نظرًا لفرض ObjectAnimator بعض القيود الإضافية، مثل طلب
الموجودة على الكائن المستهدف. |
AnimatorSet |
توفر آلية لتجميع الرسوم المتحركة معًا بحيث يتم تشغيلها ارتباطها ببعضها البعض. يمكنك ضبط الرسوم المتحركة ليتم تشغيلها معًا أو بشكل تسلسلي أو بعد بتأخير محدد. راجع القسم الذي يتناول تصميم موقع إلكتروني متعدد باستخدام "مجموعات الصور المتحركة" للحصول على مزيد من المعلومات. |
تخبر المقيّمون نظام الرسوم المتحركة للخصائص بكيفية حساب قيم قيمة
الموقع. وهي تأخذ بيانات التوقيت التي يوفّرها Animator
.
الفئة، وقيمة بداية ونهاية الرسوم المتحركة، وحساب القيم المتحركة للخاصية
استنادًا إلى هذه البيانات. يوفر نظام الرسوم المتحركة للخصائص المقيّمين التاليين:
الصف/الواجهة | الوصف |
---|---|
IntEvaluator |
المقيِّم التلقائي الذي يحتسب القيم الخاصة بسمات int |
FloatEvaluator |
المقيِّم التلقائي الذي يحتسب القيم الخاصة بسمات float |
ArgbEvaluator |
المقيِّم الافتراضي لحساب القيم لخصائص الألوان التي يتم تمثيلها كقيم سداسية عشرية. |
TypeEvaluator |
واجهة تتيح لك إنشاء المقيّم الخاص بك. إذا كنت تقوم بتحريك
سمة كائن ليست عبارة عن int أو float أو لون
يجب تنفيذ واجهة TypeEvaluator لتحديد طريقة
لحساب القيم المتحركة لخصائص الكائن. يمكنك أيضًا تحديد قيمة TypeEvaluator مخصّصة لـ int وfloat واللون.
إذا كنت تريد معالجة هذه الأنواع بشكل مختلف عن السلوك الافتراضي.
راجِع القسم حول استخدام مقيّم TypeEvaluator لمزيد من المعلومات.
معلومات حول كيفية كتابة مقيّم مخصص. |
يحدد محدِّد الوقت كيفية حساب القيم المحددة في الرسوم المتحركة
وظيفة الوقت. على سبيل المثال، يمكنك تحديد الرسوم المتحركة التي تحدث خطيًا على مستوى الكل
رسم متحرك، بمعنى أن الرسوم المتحركة تتحرك بالتساوي طوال الوقت، أو يمكنك تحديد الرسوم المتحركة
استخدام الوقت غير الخطي، مثل، الإسراع في البداية والتباطؤ في
نهاية الرسوم المتحركة. يصف الجدول 3 أدوات الاستيفاء المضمَّنة في android.view.animation
. في حال لم يكن أي من محقِّقي الترجمة المقدَّمين مناسبًا
وفقًا لاحتياجاتك، يمكنك تنفيذ واجهة TimeInterpolator
وإنشاء واجهة مستخدم خاصة بك. راجِع مقالة استخدام أدوات الاستيفاء لمزيد من المعلومات عن طريقة كتابة نص مخصّص.
أداة التعديل.
الصف/الواجهة | الوصف |
---|---|
AccelerateDecelerateInterpolator |
يشير ذلك المصطلح إلى أداة استقراء معدّل يبدأ بتغيُّره وينتهي ببطء ولكنه يتسارع بشكل أسرع. من المنتصف. |
AccelerateInterpolator |
يشير ذلك المصطلح إلى أداة استقراء معدّل يبدأ بتغيّر مسارها ببطء ثم على الأقل. يتسارع. |
AnticipateInterpolator |
أداة إدخال المحتوى الذي يبدأ تغييره بالوراء ثم الانتقال للأمام |
AnticipateOvershootInterpolator |
أداة تحويل النص إلى كلام يبدأ تغييرها بالوراء وتقفز للأمام وتتجاوز الأهداف القيمة المستهدفة، ثم يعود في النهاية إلى القيمة النهائية. |
BounceInterpolator |
أداة التعديل التي يرتد تغييرها في النهاية |
CycleInterpolator |
يشير ذلك المصطلح إلى أداة تعديل المحتوى الذي يتم تكرار صورته المتحركة لعدد محدَّد من الدورات. |
DecelerateInterpolator |
يشير ذلك المصطلح إلى أداة استقراء معدّل يبدأ تغيّرها بسرعة ثم يتراجع. |
LinearInterpolator |
يشير ذلك المصطلح إلى أداة الاستيفاء التي يكون معدّل تغييرها ثابتًا. |
OvershootInterpolator |
يشير هذا المصطلح إلى أداة تعديل البيانات التي يتحرك التغيير للأمام ويتجاوز القيمة الأخيرة. يعود. |
TimeInterpolator |
واجهة تتيح لك تنفيذ مترجمك الخاص. |
إضافة تأثيرات متحركة باستخدام ValueAnimator
تتيح لك الفئة ValueAnimator
تحريك قيم من نوع معيّن
مدة الحركة من خلال تحديد مجموعة من int
أو float
أو لون
القيم المراد تحريكها. تحصل على ValueAnimator
من خلال استدعاء أحد
طرق المصنع: ofInt()
أو ofFloat()
أو ofObject()
مثلاً:
Kotlin
ValueAnimator.ofFloat(0f, 100f).apply { duration = 1000 start() }
Java
ValueAnimator animation = ValueAnimator.ofFloat(0f, 100f); animation.setDuration(1000); animation.start();
في هذا الرمز، تبدأ ValueAnimator
في احتساب قيم
الحركة، من 0 إلى 100، ولمدة 1000 ملي ثانية، عند تشغيل طريقة start()
.
يمكنك أيضًا تحديد نوع مخصّص لتحريكه من خلال تنفيذ ما يلي:
Kotlin
ValueAnimator.ofObject(MyTypeEvaluator(), startPropertyValue, endPropertyValue).apply { duration = 1000 start() }
Java
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue); animation.setDuration(1000); animation.start();
في هذا الرمز، تبدأ ValueAnimator
في احتساب قيم
الرسوم المتحركة، بين startPropertyValue
وendPropertyValue
باستخدام
يتم توفيره من قِبل MyTypeEvaluator
لمدة 1, 000 ملي ثانية، عند تشغيل طريقة start()
.
يمكنك استخدام قيم الرسوم المتحركة عن طريق إضافة
AnimatorUpdateListener
إلى الكائن ValueAnimator
، كما هو موضح في
الرمز التالي:
Kotlin
ValueAnimator.ofObject(...).apply { ... addUpdateListener { updatedAnimation -> // You can use the animated value in a property that uses the // same type as the animation. In this case, you can use the // float value in the translationX property. textView.translationX = updatedAnimation.animatedValue as Float } ... }
Java
animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator updatedAnimation) { // You can use the animated value in a property that uses the // same type as the animation. In this case, you can use the // float value in the translationX property. float animatedValue = (float)updatedAnimation.getAnimatedValue(); textView.setTranslationX(animatedValue); } });
في onAnimationUpdate()
يمكنك من خلاله الوصول إلى قيمة الرسوم المتحركة المحدَّثة واستخدامها في خاصية
إحدى طرق العرض الخاصة بك. لمزيد من المعلومات حول المستمعين، راجِع القسم حول
أدوات معالجة الصور المتحركة:
إنشاء تأثيرات متحركة باستخدام ObjectAnimator
ObjectAnimator
هي فئة فرعية من ValueAnimator
(تمت مناقشتها في القسم السابق) وتجمع بين التوقيت.
احتساب المحرك والقيمة ValueAnimator
مع القدرة على
تحريك خاصية مُسمّاة لكائن مستهدَف. هذا يجعل تحريك أي كائن بشكل أسهل بكثير، حيث
لم تعد بحاجة إلى تنفيذ ValueAnimator.AnimatorUpdateListener
،
لأنه يتم تحديث الخاصية المتحركة تلقائيًا.
يتشابه إنشاء مثيل ObjectAnimator
مع ValueAnimator
، ولكن يمكنك أيضًا تحديد الكائن واسم خاصية ذلك الكائن (على النحو التالي:
سلسلة) بالإضافة إلى القيم المطلوب تحريكها بين:
Kotlin
ObjectAnimator.ofFloat(textView, "translationX", 100f).apply { duration = 1000 start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(textView, "translationX", 100f); animation.setDuration(1000); animation.start();
لتفعيل ميزة تعديل المواقع الإلكترونية في "ObjectAnimator
"
بشكل صحيح، يجب عليك القيام بما يلي:
- يجب أن يكون لخاصية الكائن الذي تقوم بتحريكه دالة setter (في حالة الجمل) على شكل
set<PropertyName>()
لأنّObjectAnimator
يقوم بتحديث الخاصية تلقائيًا أثناء تشغيل الحركة، يجب أن يكون قادرًا على الوصول إليها باستخدام طريقة التعيين هذه. على سبيل المثال، إذا كان اسم السمة هوfoo
، يجب تنفيذ ما يلي: على طريقةsetFoo()
. إذا لم تكن طريقة setter هذه موجودة، يكون لديك ثلاثة الخيارات:- أضف طريقة setter إلى الفئة إذا كنت تملك الحق في ذلك.
- استخدِم فئة برنامج تضمين يحق لك تغييرها واطلب من برنامج تضمين هذا التغيير باستخدام طريقة setter صالحة، ثم إعادة توجيهها إلى الكائن الأصلي.
- يمكنك استخدام
ValueAnimator
كبديل.
- إذا حدّدت قيمة واحدة فقط للمَعلمة
values...
باستخدام إحدى طرق المصنعObjectAnimator
، يُفترض أن تكون هذه القيمة النهائية الرسوم المتحركة. وبالتالي، يجب أن تحتوي خاصية الكائن التي تعمل على تحريكها على دالة getter تُستخدم للحصول على القيمة الأولية للرسوم المتحركة. يجب أن تكون دالة getter في منget<PropertyName>()
. على سبيل المثال، إذا كان اسم الخاصيةfoo
، يجب أن تتوفّر لديك طريقةgetFoo()
. - يجب أن طرق getter (إذا لزم الأمر) والتعيين للخاصية التي تقوم بتحريكها
تعمل على نفس نوع قيم البداية والنهاية التي تحددها إلى
ObjectAnimator
. على سبيل المثال، يجب أن يكون لديكtargetObject.setPropName(float)
وtargetObject.getPropName()
في حال إنشاءObjectAnimator
التالي:ObjectAnimator.ofFloat(targetObject, "propName", 1f)
- واعتمادًا على الخاصية أو الكائن الذي تقوم بتحريكه، قد تحتاج إلى استدعاء طريقة
invalidate()
في طريقة العرض لإجبار الشاشة على إعادة رسمها باستخدام القيم المتحركة المحدثة. يمكنك إجراء ذلك فيonAnimationUpdate()
معاودة الاتصال. فعلى سبيل المثال، تؤدي تحريك خاصية اللون لكائن قابل للرسم فقط إلى حدوث تحديثات في الشاشة عندما يعيد هذا الكائن رسمه. كل أماكن تحديد المواقع على "العرض"، مثلsetAlpha()
وsetTranslationX()
إلغاء صلاحية العرض على نحو سليم، فلا يلزم إلغاء صلاحية العرض عند استدعاء هذه باستخدام قيم جديدة. لمزيد من المعلومات حول المستمعين، راجِع القسم حول أدوات معالجة الصور المتحركة:
تصميم صور متحركة متعددة باستخدام AnimatorSet
في كثير من الحالات، تريد تشغيل رسم متحرك يعتمد على وقت بدء أو
ينتهي. يتيح نظام Android تجميع الصور المتحركة معًا في AnimatorSet
، وذلك لتتمكّن من تحديد ما إذا كان يجب بدء الصور المتحركة أم لا
في وقت واحد أو بشكل تسلسلي أو بعد مهلة محددة. يمكنك أيضًا دمج عناصر AnimatorSet
داخل بعضها.
يُشغِّل مقتطف الرمز التالي ملف Animator
التالي.
بالشكل التالي:
- يتم تشغيل
bounceAnim
. - يتم تشغيل
squashAnim1
وsquashAnim2
وstretchAnim1
وstretchAnim2
في نفس الوقت. - يتم تشغيل
bounceBackAnim
. - يتم تشغيل
fadeAnim
.
Kotlin
val bouncer = AnimatorSet().apply { play(bounceAnim).before(squashAnim1) play(squashAnim1).with(squashAnim2) play(squashAnim1).with(stretchAnim1) play(squashAnim1).with(stretchAnim2) play(bounceBackAnim).after(stretchAnim2) } val fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f).apply { duration = 250 } AnimatorSet().apply { play(bouncer).before(fadeAnim) start() }
Java
AnimatorSet bouncer = new AnimatorSet(); bouncer.play(bounceAnim).before(squashAnim1); bouncer.play(squashAnim1).with(squashAnim2); bouncer.play(squashAnim1).with(stretchAnim1); bouncer.play(squashAnim1).with(stretchAnim2); bouncer.play(bounceBackAnim).after(stretchAnim2); ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f); fadeAnim.setDuration(250); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(bouncer).before(fadeAnim); animatorSet.start();
أدوات معالجة الأحداث المتحركة
يمكنك الاستماع إلى الأحداث المهمة أثناء مدة تشغيل الصورة المتحركة مع المستمعين الموضحين أدناه.
Animator.AnimatorListener
onAnimationStart()
- يتم استدعاؤه عند بدء تشغيل الرسوم المتحركة.onAnimationEnd()
- يتم استدعاء هذا الإجراء عند انتهاء الصورة المتحركة.onAnimationRepeat()
: يتم استدعاؤه عندما يتم تكرار الصورة المتحركة من تلقاء نفسها.onAnimationCancel()
- يتم استدعاؤه عند إلغاء الصورة المتحركة. صورة متحركة تم إلغاؤها الاتصال أيضًا بـonAnimationEnd()
، بغض النظر عن كيفية إنهائها.
ValueAnimator.AnimatorUpdateListener
-
onAnimationUpdate()
- يتم استدعاؤه في كل إطار في الصورة المتحركة. الاستماع إلى هذا الحدث إلى استخدام القيم المحسوبة الناتجة عنValueAnimator
خلال الرسوم المتحركة. لاستخدام القيمة، أدخِل طلب بحث عن الكائنValueAnimator
. يتم تمريره إلى الحدث للحصول على القيمة المتحركة الحالية باستخدام الطريقةgetAnimatedValue()
. إن تنفيذ هذه يجب توفير أداة معالجة الأحداث في حال استخدامValueAnimator
.اعتمادًا على الخاصية أو الكائن الذي تقوم بتحريكه، قد تحتاج إلى استدعاء
invalidate()
في طبقة عرض لفرض هذه المنطقة من لإعادة رسم نفسها باستخدام القيم المتحركة الجديدة. على سبيل المثال، يؤدي تحريك لا تتسبب خاصية اللون لكائن قابل للرسم في إجراء تحديثات على الشاشة إلا عندما يكون هذا الكائن يعيد رسم نفسه. تقع جميع المواقع على View مثلsetAlpha()
و يلغيsetTranslationX()
صلاحية العرض بشكل صحيح، لذلك لا تحتاج إلى إلغاء صلاحية العرض عند استدعاء هذه الطرق بقيم جديدة.
-
يمكنك تمديد الصف AnimatorListenerAdapter
بدلاً من
تنفيذ واجهة Animator.AnimatorListener
، إذا لم يتم
تريد تطبيق جميع طرق Animator.AnimatorListener
من واجهة pyplot. يوفّر الصف AnimatorListenerAdapter
قيمة فارغة.
وعمليات التنفيذ للطرق التي يمكنك اختيار تجاوزها.
على سبيل المثال، يُنشئ مقتطف الرمز التالي AnimatorListenerAdapter
مقابل onAnimationEnd()
فقط
رد الاتصال:
Kotlin
ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f).apply { duration = 250 addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { balls.remove((animation as ObjectAnimator).target) } }) }
Java
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f); fadeAnim.setDuration(250); fadeAnim.addListener(new AnimatorListenerAdapter() { public void onAnimationEnd(Animator animation) { balls.remove(((ObjectAnimator)animation).getTarget()); }
تحريك تغييرات التنسيق لكائنات ViewGroup
يوفّر نظام الصور المتحركة للخصائص إمكانية تحريك التغييرات على كائنات ViewGroup. فضلاً عن توفير طريقة سهلة لتحريك عناصر العرض نفسها.
ويمكنك تحريك تغييرات التنسيق داخل ViewGroup باستخدام
صف واحد (LayoutTransition
). يمكن لطريقة العرض داخل ViewGroup
حركة تظهر وتختفي عند إضافتها إلى
إزالتها من ViewGroup أو عند استدعاء عنصر
طريقة واحدة (setVisibility()
) مع
VISIBLE
أو INVISIBLE
أو
GONE
يمكن أيضًا أن تتضمن طرق العرض المتبقية
تتحرك في مواضعها الجديدة عند إضافة طرق عرض أو إزالتها. يمكنك تحديد
الصور المتحركة التالية في كائن LayoutTransition
من خلال الاتصال بـ setAnimator()
وتمريره في كائن Animator
بإحدى القيم
ثوابت LayoutTransition
التالية:
APPEARING
- علامة تشير إلى الحركة التي تعمل على العناصر يظهر في الحاوية.CHANGE_APPEARING
- علامة تشير إلى الحركة التي تعمل على العناصر تتغير بسبب ظهور عنصر جديد في الحاوية.DISAPPEARING
- علامة تشير إلى الحركة التي تعمل على العناصر تختفي من الحاوية.CHANGE_DISAPPEARING
- علامة تشير إلى الصورة المتحركة التي تعمل على العناصر تتغير بسبب اختفاء عنصر من الحاوية.
يمكنك تحديد الصور المتحركة المخصصة لهذه الأنواع الأربعة من الأحداث لتخصيص مظهر انتقالات التخطيط أو الاكتفاء بإخبار نظام الرسوم المتحركة باستخدام الرسوم المتحركة الافتراضية.
لضبط السمة android:animateLayoutchanges
على true
تقوم ViewGroup بما يلي:
<LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="match_parent" android:id="@+id/verticalContainer" android:animateLayoutChanges="true" />
يؤدي تعيين هذه السمة على "صواب" إلى الحركة تلقائيًا لطرق العرض التي تتم إضافتها أو إزالتها من ViewGroup بالإضافة إلى طرق العرض المتبقية في ViewGroup.
تحريك تغييرات حالة العرض باستخدام StateListAnimator
تتيح لك الفئة StateListAnimator
تحديد الرسوم المتحركة التي تعمل عندما
تتغير حالة العرض. يعمل هذا الكائن كبرنامج تضمين
Animator
، ويتم استدعاء هذه الحركة متى تم تحديد
تغييرات حالة العرض (مثل التغييرات "الضغطة" أو "التركيز".
يمكن تحديد StateListAnimator
في مورد XML باستخدام جذر.
عنصر <selector>
وعناصر <item>
الثانوية التي يحدد كل منها
حالة عرض مختلفة تحدّدها الفئة StateListAnimator
. على كل
يتضمّن <item>
تعريف مجموعة صور متحركة للسمات.
على سبيل المثال، ينشئ الملف التالي صورًا متحركة لقائمة حالات يغير المقياس x وy طريقة العرض عند الضغط عليها:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- the pressed state; increase x and y size to 150% --> <item android:state_pressed="true"> <set> <objectAnimator android:propertyName="scaleX" android:duration="@android:integer/config_shortAnimTime" android:valueTo="1.5" android:valueType="floatType"/> <objectAnimator android:propertyName="scaleY" android:duration="@android:integer/config_shortAnimTime" android:valueTo="1.5" android:valueType="floatType"/> </set> </item> <!-- the default, non-pressed state; set x and y size to 100% --> <item android:state_pressed="false"> <set> <objectAnimator android:propertyName="scaleX" android:duration="@android:integer/config_shortAnimTime" android:valueTo="1" android:valueType="floatType"/> <objectAnimator android:propertyName="scaleY" android:duration="@android:integer/config_shortAnimTime" android:valueTo="1" android:valueType="floatType"/> </set> </item> </selector>
لإرفاق الصورة المتحركة لقائمة الحالات بأحد طرق العرض، أضف
android:stateListAnimator
على النحو التالي:
<Button android:stateListAnimator="@xml/animate_scale" ... />
يتم الآن استخدام الرسوم المتحركة المحددة في animate_scale.xml
عندما يكون هذا الزر
تغيرات الحالة.
أو، بدلاً من ذلك، لتعيين صورة متحركة لقائمة حالات في طريقة عرض في التعليمات البرمجية، استخدم
AnimatorInflater.loadStateListAnimator()
، وتعيين الرسوم المتحركة إلى
طريقة العرض باستخدام طريقة View.setStateListAnimator()
.
أو بدلاً من تحريك خصائص طريقة العرض، يمكنك تشغيل صورة متحركة قابلة للرسم بين
تغير الحالة، باستخدام AnimatedStateListDrawable
.
يمكن لبعض أدوات النظام في
ويستخدم Android 5.0 هذه الصور المتحركة تلقائيًا. يوضح المثال التالي كيف
لتعريف AnimatedStateListDrawable
كمورد XML:
<!-- res/drawable/myanimstatedrawable.xml --> <animated-selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- provide a different drawable for each state--> <item android:id="@+id/pressed" android:drawable="@drawable/drawableP" android:state_pressed="true"/> <item android:id="@+id/focused" android:drawable="@drawable/drawableF" android:state_focused="true"/> <item android:id="@id/default" android:drawable="@drawable/drawableD"/> <!-- specify a transition --> <transition android:fromId="@+id/default" android:toId="@+id/pressed"> <animation-list> <item android:duration="15" android:drawable="@drawable/dt1"/> <item android:duration="15" android:drawable="@drawable/dt2"/> ... </animation-list> </transition> ... </animated-selector>
استخدام أداة TypeEvaluator
إذا كنت تريد إضافة تأثير متحرك إلى نوع غير معروف لنظام Android، يمكنك إنشاء نوعك الخاص
والمقيِّم من خلال تنفيذ واجهة TypeEvaluator
. إن الأنواع التي
التي يعرفها نظام Android هي int
، أو float
، أو أحد الألوان، وهي
متوافق مع الأنواع IntEvaluator
وFloatEvaluator
وArgbEvaluator
المقيّمين.
هناك طريقة واحدة فقط للتنفيذ في TypeEvaluator
من واجهة المستخدم، وهي طريقة evaluate()
. هذا يسمح
أداة الرسوم المتحركة التي تستخدمها لعرض قيمة مناسبة لممتلكاتك المتحركة في
النقطة الحالية من الرسوم المتحركة. توضّح الفئة FloatEvaluator
كيفية إجراء ذلك:
Kotlin
private class FloatEvaluator : TypeEvaluator<Any> { override fun evaluate(fraction: Float, startValue: Any, endValue: Any): Any { return (startValue as Number).toFloat().let { startFloat -> startFloat + fraction * ((endValue as Number).toFloat() - startFloat) } } }
Java
public class FloatEvaluator implements TypeEvaluator { public Object evaluate(float fraction, Object startValue, Object endValue) { float startFloat = ((Number) startValue).floatValue(); return startFloat + fraction * (((Number) endValue).floatValue() - startFloat); } }
ملاحظة: عند تشغيل ValueAnimator
(أو ObjectAnimator
)، يتم حساب الكسر الحالي المنقضي من
رسم متحرك (قيمة بين 0 و1) ثم يحسب نسخة مدرجة من ذلك اعتمادًا
على أداة التعديل التي تستخدمها الكسر المستورَد هو ما تتلقّاه TypeEvaluator
من خلال المعلمة fraction
، لذا يمكنك
لا يجب أن تأخذ في الاعتبار أداة الاستيفاء عند احتساب القيم المتحركة.
استخدام أدوات الاستيفاء
يحدد عامل الاستيفاء كيفية حساب قيم معينة في الرسوم المتحركة كدالة الوقت. على سبيل المثال، يمكنك تحديد الرسوم المتحركة التي تحدث خطيًا عبر الرسوم المتحركة بأكملها، مما يعني أن الرسوم المتحركة تتحرك بالتساوي طوال الوقت، أو يمكنك تحديد الرسوم المتحركة لاستخدامها أي نظام غير خطي، مثل استخدام التسارع أو التباطؤ في بداية أو نهاية الرسوم المتحركة.
يتلقى المداخلون في نظام الرسوم المتحركة جزءًا من الرسوم المتحركة التي تمثل
الوقت المنقضي من الرسوم المتحركة. تقوم المداخلات بتعديل هذا الكسر ليتزامن مع نوع
والرسوم المتحركة التي تهدف إلى تقديمها. يوفر نظام Android مجموعة من المحققين الداخليين الشائعين في
android.view.animation package
. إذا لم يناسبك أي مما سبق
يمكنك تنفيذ واجهة TimeInterpolator
وإنشاء
تمتلكه.
نذكر على سبيل المثال الطريقة التي يتم من خلالها احتساب الكسور المضمَّنة في أداة الاستيفاء التلقائي AccelerateDecelerateInterpolator
وLinearInterpolator
في ما يلي.
ولا تؤثر القيمة LinearInterpolator
في الكسر المنقضي. يتسارع AccelerateDecelerateInterpolator
إلى الصورة المتحركة
يتراجع منها. تحدّد الطرق التالية منطق أدوات الاستيفاء هذه:
AccelerateDecelerateInterpolator
Kotlin
override fun getInterpolation(input: Float): Float = (Math.cos((input + 1) * Math.PI) / 2.0f).toFloat() + 0.5f
Java
@Override public float getInterpolation(float input) { return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; }
محدّد عامل تشغيل الفيديو الخطي
Kotlin
override fun getInterpolation(input: Float): Float = input
Java
@Override public float getInterpolation(float input) { return input; }
يمثل الجدول التالي القيم التقريبية التي تم احتسابها من خلال هذه القيم أدوات تفسيرية للرسوم المتحركة التي تستمر لمدة 1000 ملّي ثانية:
الوقت المنقضي بالمللي ثانية | الكسر المنقضي/الكسر المنفصل (خطي) | الكسر المستورَد (تسريع أو تباطؤ) |
---|---|---|
0 | 0 | 0 |
200 | .2 | .1 |
400 | .4 | .345 |
600 | 6. | 8. |
800 | 8. | 9. |
1000 | 1 | 1 |
كما يبيّن الجدول، تغيّر LinearInterpolator
القيم.
بنفس السرعة، 2. لكل 200 ملّي ثانية تمر. تغيّر القيمة AccelerateDecelerateInterpolator
القيم بشكلٍ أسرع من LinearInterpolator
بين 200 و600 ملي ثانية وأبطأ بين 600 ملي ثانية.
1000 ملي ثانية.
تحديد الإطارات الرئيسية
يتألف كائن Keyframe
من زوج الوقت/القيمة الذي يتيح لك تحديد
حالة معينة في وقت معين من الرسوم المتحركة. يمكن أن يكون لكل إطار رئيسي أيضًا محوره
أداة الاستيفاء للتحكّم في سلوك الحركة في الفاصل الزمني بين
وقت الإطار الرئيسي ووقت هذا الإطار الرئيسي.
لإنشاء مثيل كائن Keyframe
، يجب استخدام أحد الشركات المصنِّعة.
أو ofInt()
أو ofFloat()
أو ofObject()
للحصول على النوع المناسب من Keyframe
. ثم تتصل
طريقة المصنع ofKeyframe()
الحصول على كائن PropertyValuesHolder
. بعد الحصول على الكائن، يمكنك
الحصول على رسم متحرك من خلال إدخال الكائن PropertyValuesHolder
الكائن المراد تحريكه. يوضح مقتطف الرمز التالي كيفية إجراء ذلك:
Kotlin
val kf0 = Keyframe.ofFloat(0f, 0f) val kf1 = Keyframe.ofFloat(.5f, 360f) val kf2 = Keyframe.ofFloat(1f, 0f) val pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2) ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation).apply { duration = 5000 }
Java
Keyframe kf0 = Keyframe.ofFloat(0f, 0f); Keyframe kf1 = Keyframe.ofFloat(.5f, 360f); Keyframe kf2 = Keyframe.ofFloat(1f, 0f); PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2); ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation); rotationAnim.setDuration(5000);
تحريك طرق العرض
يتيح نظام الرسوم المتحركة للخصائص رسومًا متحركة سلسة لكائنات "عرض" وعروضه بعض المزايا التي يتميز بها نظام عرض الرسوم المتحركة. العرض نظام الرسوم المتحركة حول كائنات العرض بتغيير طريقة رسمها. كان هذا معالجتها في حاوية كل طريقة عرض، لأن طريقة العرض نفسها لا تحتوي على خصائص لمعالجةها. ونتج عن ذلك تحريك العرض، ولكن لم يحدث أي تغيير في كائن العرض نفسه. هذا النمط إلى سلوك معين، مثل بقاء كائن ما في مكانه الأصلي، على الرغم من مرسومة على موقع مختلف على الشاشة. في Android 3.0، المواقع الجديدة تمت إضافة طرق الاستدعاء والضبط للتخلص من هذا العيب.
نظام الرسوم المتحركة للممتلكات
يمكنها تحريك طرق العرض على الشاشة من خلال تغيير الخصائص الفعلية في كائنات "العرض". ضِمن
بالإضافة إلى ذلك، يطلق على المشاهدات أيضًا تلقائيًا اسم invalidate()
لتحديث الشاشة كلما تم تغيير خصائصها. في ما يلي السمات الجديدة في الفئة View
التي تسهّل الصور المتحركة للسمات:
translationX
وtranslationY
: تتحكم هذه الخصائص في مكان يقع العرض على شكل دلتا من إحداثياته اليسرى والعلوية التي يتم تعيينها حسب تخطيطه .rotation
وrotationX
وrotationY
: هذه السمات التحكم في التدوير في الوضع الثنائي الأبعاد (الخاصيةrotation
) والعرض الثلاثي الأبعاد حول النقطة المحورية.scaleX
وscaleY
: تتحكم هذه الخصائص في التحجيم الثنائي الأبعاد عرض حول نقطة المحورpivotX
وpivotY
: تتحكم هذه الخصائص في موقع النقطة المحورية، التي يحدث حولها تحويلات الدوران والتحجيم. بشكل افتراضي، في منتصف الكائن.x
وy
: هذه هي خصائص منفعة بسيطة لوصف الموقع النهائي للعرض في حاويته، كمجموع للقيم المتبقية والعلوية قيم translateX وTranslationY.alpha
: يمثل شفافية ألفا في العرض. هذه القيمة 1 (قيمة فارغة) بشكلٍ تلقائي، مع القيمة 0 التي تمثل الشفافية الكاملة (غير مرئية).
لتحريك خاصية لكائن عرض، مثل لونه أو قيمة تدويره، ما عليك سوى فعله هو إنشاء أداة حركة الخصائص وتحديد خاصية العرض التي تريد صورة متحركة. مثلاً:
Kotlin
ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f)
Java
ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);
لمزيد من المعلومات عن إنشاء الرسوم المتحركة، راجع الأقسام المتعلقة بإنشاء الصور المتحركة باستخدام ValueAnimator وObjectAnimator:
إنشاء تأثيرات متحركة باستخدام ViewPropertyAnimator
يوفّر ViewPropertyAnimator
طريقة بسيطة لإضافة تأثيرات متحركة متعددة
خصائص View
بشكل متوازٍ، باستخدام قيمة Animator
أساسية واحدة
الخاص بك. ويعمل هذا الإجراء إلى حدّ كبير مثل ObjectAnimator
، لأنّه يغيّر
القيم الفعلية لخصائص الملف الشخصي، ولكنها أكثر كفاءة عند تحريك العديد من الخصائص في
مرة واحدة. بالإضافة إلى ذلك، فإن رمز استخدام ViewPropertyAnimator
هو
أكثر إيجازًا وأسهل في القراءة. توضح مقتطفات الرمز التالية الاختلافات في استخدام رموز
ObjectAnimator
عنصرًا، عنصر واحد
وObjectAnimator
، وViewPropertyAnimator
عند
تحريك السمتَين x
وy
من ملف شخصي في آنٍ واحد.
كائنات عناصر متحركة متعددة
Kotlin
val animX = ObjectAnimator.ofFloat(myView, "x", 50f) val animY = ObjectAnimator.ofFloat(myView, "y", 100f) AnimatorSet().apply { playTogether(animX, animY) start() }
Java
ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f); ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f); AnimatorSet animSetXY = new AnimatorSet(); animSetXY.playTogether(animX, animY); animSetXY.start();
أداة One ObjectAnimator
Kotlin
val pvhX = PropertyValuesHolder.ofFloat("x", 50f) val pvhY = PropertyValuesHolder.ofFloat("y", 100f) ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvhY).start()
Java
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f); PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f); ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvhY).start();
ViewPropertyAnimator
Kotlin
myView.animate().x(50f).y(100f)
Java
myView.animate().x(50f).y(100f);
للحصول على معلومات أكثر تفصيلاً حول ViewPropertyAnimator
، يمكنك الاطّلاع على مطوّري تطبيقات Android المعنيّين.
مدونة
مشاركة.
تعريف الصور المتحركة بتنسيق XML
يتيح لك نظام الرسوم المتحركة للخصائص الإعلان عن الرسوم المتحركة للخصائص باستخدام XML بدلاً من برمجيًا. من خلال تحديد الصور المتحركة بتنسيق XML، يمكنك إعادة استخدام الصور المتحركة بسهولة. في أنشطة متعددة وتعديل تسلسل الرسوم المتحركة بسهولة أكبر.
لتمييز ملفات الصور المتحركة التي تستخدم واجهات برمجة التطبيقات الجديدة للصور المتحركة للخصائص عن الملفات التي تستخدم
إطار عمل العرض المتحركة القديم
بدءًا من الإصدار 3.1 من نظام التشغيل Android، يجب حفظ ملفات XML الخاصة برسوم متحركة للخصائص في دليل res/animator/
.
تشمل فئات الرسوم المتحركة للخصائص التالية توافق إعلان XML مع علامات XML التالية:
ValueAnimator
-<animator>
ObjectAnimator
-<objectAnimator>
AnimatorSet
-<set>
للعثور على السمات التي يمكنك استخدامها في بيان XML، يمكنك الاطّلاع على المقالة حركة الموارد يشغّل المثال التالي مجموعتي صور متحركة للكائن بالتسلسل، مع أول مجموعة متداخلة تقوم بتشغيل صور متحركة لكائن معًا:
<set android:ordering="sequentially"> <set> <objectAnimator android:propertyName="x" android:duration="500" android:valueTo="400" android:valueType="intType"/> <objectAnimator android:propertyName="y" android:duration="500" android:valueTo="300" android:valueType="intType"/> </set> <objectAnimator android:propertyName="alpha" android:duration="500" android:valueTo="1f"/> </set>
لتشغيل هذه الحركة، يجب تضخيم موارد XML في الرمز البرمجي إلى عنصر AnimatorSet
، ثم ضبط العناصر المستهدفة لجميع المؤثرات الحركية.
قبل بدء تشغيل الرسوم المتحركة. يؤدي استدعاء setTarget()
إلى ضبط كائن مستهدف واحد لكل العناصر الثانوية لـ AnimatorSet
لتوفير تجربة مريحة للمستخدمين. يوضح الرمز التالي كيفية إجراء هذا:
Kotlin
(AnimatorInflater.loadAnimator(myContext, R.animator.property_animator) as AnimatorSet).apply { setTarget(myObject) start() }
Java
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext, R.animator.property_animator); set.setTarget(myObject); set.start();
يمكنك أيضًا الإعلان عن ValueAnimator
في XML باعتباره
كما هو موضح في المثال التالي:
<animator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:valueType="floatType" android:valueFrom="0f" android:valueTo="-100f" />
لاستخدام ValueAnimator
السابق في الرمز، عليك
يجب تضخيم الكائن، وإضافة
AnimatorUpdateListener
,
والحصول على قيمة الرسوم المتحركة المحدّثة، واستخدامها في خاصية من طرق العرض،
كما هو موضح في التعليمة البرمجية التالية:
Kotlin
(AnimatorInflater.loadAnimator(this, R.animator.animator) as ValueAnimator).apply { addUpdateListener { updatedAnimation -> textView.translationX = updatedAnimation.animatedValue as Float } start() }
Java
ValueAnimator xmlAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.animator); xmlAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator updatedAnimation) { float animatedValue = (float)updatedAnimation.getAnimatedValue(); textView.setTranslationX(animatedValue); } }); xmlAnimator.start();
للحصول على معلومات عن بنية XML لتحديد الصور المتحركة للخصائص، يمكنك الاطّلاع على حركة الموارد .
التأثيرات المحتملة على أداء واجهة المستخدم
تنشئ الصور المتحركة التي تُحدّث واجهة المستخدم عمل عرض إضافيًا لكل إطار في الذي يتم تشغيله الرسوم المتحركة. ولهذا السبب، فإن استخدام الرسوم المتحركة بكثافة موارد يمكن أن تؤثر سلبًا في أداء تطبيقك.
تتم إضافة العمل المطلوب لتحريك واجهة المستخدم إلى مرحلة الصورة المتحركة مسار العرض. يمكنك معرفة ما إذا كانت الرسوم المتحركة تؤثر على مستوى أداء تطبيقك من خلال تفعيل عرض وحدة معالجة الرسومات للملف الشخصي مراقبة مرحلة الرسوم المتحركة. لمزيد من المعلومات، يُرجى الاطّلاع على عرض الملف الشخصي لوحدة معالجة الرسومات. جولة تفصيلية.