تسريع الأجهزة

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

يتم تفعيل ميزة "تسريع الأجهزة" تلقائيًا إذا كان مستوى واجهة برمجة التطبيقات المستهدَف أكبر من أو يساوي 14، ويمكن أيضًا أن أن يتم تفعيلها بشكل صريح. إذا كان تطبيقك يستخدم طرق العرض العادية Drawable، لن يؤدي تفعيل هذه الميزة على مستوى العالم إلى حدوث أي رسم سلبي. التأثيرات. ومع ذلك، ولأن تسريع الأجهزة غير متوافق مع كل الرسومات الثنائية الأبعاد العمليات، فإن تشغيلها قد يؤثر في بعض طرق العرض المخصصة أو رسم المكالمات. المشاكل نفسها على أنها عناصر غير مرئية أو استثناءات أو وحدات بكسل يتم عرضها بشكل خاطئ. إلى لمعالجة هذا الأمر، يمنحك Android خيار تمكين أو تعطيل تسريع الأجهزة المستويات. راجِع التحكُّم في تسريع الأجهزة.

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

راجع أيضًا OpenGL مع واجهات برمجة تطبيقات إطار العمل وRenderscript

التحكّم في تسريع الأجهزة

يمكنك التحكم في تسريع الأجهزة على المستويات التالية:

  • طلب الانضمام
  • النشاط
  • نافذة
  • عرض

مستوى التطبيق

في ملف بيان Android، أضِف السمة التالية إلى <application> لتفعيل تسريع الأجهزة على مستوى الجهاز بالكامل app:

<application android:hardwareAccelerated="true" ...>

مستوى النشاط

إذا كان تطبيقك لا يعمل بشكل صحيح مع تفعيل تسريع الأجهزة على مستوى العالم، ينبغي لك التحكم فيه في الأنشطة الفردية أيضًا. لتفعيل ميزة "تسريع الأجهزة" أو إيقافها على مستوى النشاط، يمكنك استخدام سمة android:hardwareAccelerated من أجل <activity> يتيح المثال التالي تفعيل تسريع الأجهزة التطبيق بالكامل ولكن يعطله لنشاط واحد:

<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

مستوى النافذة

إذا كنت بحاجة إلى المزيد من التحكم الدقيق، يمكنك تفعيل تسريع الأجهزة نافذة بالتعليمة البرمجية التالية:

Kotlin

window.setFlags(
        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
)

Java

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

ملاحظة: لا يمكنك حاليًا إيقاف ميزة تسريع الأجهزة في مستوى النافذة.

على مستوى الملفّ الشخصي

يمكنك إيقاف ميزة "تسريع الأجهزة" لعرض فردي في وقت التشغيل باستخدام الرمز التالي:

Kotlin

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

Java

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

ملاحظة: لا يمكنك حاليًا تفعيل ميزة "تسريع الأجهزة" على على مستوى العرض. يكون لعرض الطبقات وظائف أخرى إلى جانب تعطيل تسريع الأجهزة. راجع عرض الطبقات لمزيد من المعلومات حول استخداماتها.

تحديد ما إذا كانت طريقة العرض مسرَّعة باستخدام الأجهزة

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

هناك طريقتان مختلفتان للتأكد مما إذا كان التطبيق يعمل على تسريع الأجهزة:

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

نماذج الرسم في Android

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

نموذج رسم قائم على البرامج

في نموذج رسم البرنامج، يتم رسم مرات العرض من خلال الخطوتين التاليتين:

  1. إلغاء صلاحية التدرج الهرمي
  2. رسم التسلسل الهرمي

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

  • أولاً، يتطلب هذا النموذج تنفيذ الكثير من التعليمات البرمجية في كل ممر رسم. على سبيل المثال، إذا يستدعي تطبيقك invalidate() على زر وأن أعلى شاشة أخرى، يعيد نظام Android رسم العرض حتى لو لم يكن بتغييره.
  • المشكلة الثانية هي أن نموذج الرسم يمكن أن يخفي أخطاء في تطبيقك. نظرًا لأن يُعيد نظام Android رسم طرق العرض عندما تتقاطع مع المنطقة غير النظيفة، وهي طريقة عرض يتم عرض المحتوى فيها قد تتم إعادة رسمها على الرغم من أن invalidate() لم دعا إليه. وفي هذه الحالة، فأنت تعتمد على ملف شخصي آخر تم إبطاله للحصول على السلوك الصحيح. ويمكن أن يتغير هذا السلوك في كل مرة تُعدِّل فيها تطبيقك. بسبب لهذا، عليك دائمًا استدعاء invalidate() على كلما عدّلت البيانات أو الحالة التي تؤثر في رمز الرسم لطريقة العرض.

ملاحظة: تستدعي طرق عرض Android اسم invalidate() تلقائيًا عند تغيير خصائصها، مثل الخلفية اللون أو النص المكتوب في TextView.

نموذج الرسم المسرّع بالأجهزة

لا يزال نظام Android يستخدم invalidate() وdraw() لطلب تحديثات الشاشة وعرض المشاهدات، إلا أنّه يعالج الرسم الفعلي بشكل مختلف. وبدلاً من تنفيذ أوامر الرسم على الفور، يستخدم نظام يسجّلها النظام داخل قوائم العرض التي تحتوي على ناتج تعليمة الرسم. هناك تحسين آخر هو أنّ نظام Android يحتاج فقط إلى تسجيل البيانات وتحديثها. عرض قوائم بطُرق العرض التي تم وضع علامة invalidate() عليها باعتبارها غير صالحة الاتصال. ويمكن إعادة رسم المشاهدات التي لم يتم إبطال صلاحيتها من خلال إعادة إصدار قائمة العرض المسجلة. يحتوي نموذج الرسم الجديد على ثلاث مراحل:

  1. إلغاء صلاحية التدرج الهرمي
  2. تسجيل قوائم العرض وتعديلها
  3. رسم قوائم العرض

وباستخدام هذا النموذج، لا يمكنك الاعتماد على طريقة عرض تتقاطع مع المنطقة غير النظيفة لتنفيذ طريقة draw() الخاصة بها. للتأكد من أن نظام Android يسجّل في قائمة العرض، يجب الاتصال بـ invalidate(). نسيان أن يؤدي ذلك إلى جعل طريقة العرض تبدو كما هي حتى بعد تغييرها.

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

  • DrawDisplayList(ListView)
  • DrawDisplayList(Button)

لنفترض الآن أنك تريد تغيير مدى تعتيم ListView. بعد جارٍ استدعاء setAlpha(0.5f) على ListView، قائمة العرض الآن يحتوي على ما يلي:

  • SaveLayerAlpha(0.5)
  • DrawDisplayList(ListView)
  • استعادة
  • DrawDisplayList(Button)

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

دعم عمليات الرسم

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

يوضّح الجدول التالي مستوى الدعم لمختلف العمليات على مستوى مستويات واجهة برمجة التطبيقات:

أول مستوى متوافق لواجهة برمجة التطبيقات
لوحة
drawBitmapMesh() (صفيف ألوان) 18
drawPicture() 23
drawPosText() 16
DragTextOnPath() 16
DragVertices() 29
setDrawFilter() 16
ClipPath() 18
ClipRegion() 18
ClipRect(Region.Op.XOR) 18
ClipRect(Region.Op.يزيد) 18
ClipRect(Region.Op.Reverse فرق) 18
ClipRect() مع دوران/منظور 18
طلاء
setAntialias() (للنص) 18
setAntiAlias() (للخطوط) 16
setFilterBitmap() 17
setLinearText()
setMaskFilter()
setPathEffect() (للخطوط) 28
setShadowLayer() (بخلاف النص) 28
setStrokeCap() (للخطوط) 18
setStrokeCap() (للنقاط) 19
setSubpixelText() 28
Xfermode
PorterDuff.Mode.DARKEN (إطار المخزن المؤقت) 28
PorterDuff.Mode.LIGHTEN (framebuffer) 28
PorterDuff.Mode.OVERLAY (framebuffer) 28
مظللة
ComposeShader داخل ComposeShader 28
أدوات تظليل الأنواع نفسها في ComposeShader 28
المصفوفة المحلية في ComposeShader 18

تحجيم اللوحة

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

يوضّح الجدول التالي وقت تغيير عملية التنفيذ للتعامل مع المقاييس الكبيرة بشكل صحيح:
عملية الرسم المطلوب تغيير حجمها أول مستوى متوافق لواجهة برمجة التطبيقات
drawText() 18
drawPosText() 28
DragTextOnPath() 28
أشكال بسيطة* 17
الأشكال المعقدة* 28
drawPath() 28
طبقة الظل 28

ملاحظة: "بسيط" والأشكال هي drawRect()، drawCircle() وdrawOval() وdrawRoundRect() و أوامر drawArc() (باستخدام useCenter=false) التي تم إصدارها بإصدار لا يحتوي على PathEffect، ولا يحتوي على عمليات ضم غير تلقائية (عبر setStrokeJoin() /) setStrokeMiter()). وتندرج المثيلات الأخرى لأوامر الرسم هذه ضمن "معقد"، بوصة المخطط أعلاه.

إذا كان تطبيقك متأثرًا بأي من هذه الميزات أو القيود غير المتوفّرة، يمكنك تفعيل من تسريع الأجهزة للجزء المتأثر فقط من التطبيق عن طريق استدعاء setLayerType(View.LAYER_TYPE_SOFTWARE, null) بهذه الطريقة، يمكنك لا يزال يستفيد من تسريع الأجهزة في أي مكان آخر. يمكنك الاطّلاع على مقالة التحكم في تسريع الأجهزة للحصول على مزيد من المعلومات حول كيفية تفعيل هذه الميزة. وتعطيل ميزة تسريع الأجهزة على مستويات مختلفة في التطبيق.

عرض الطبقات

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

بدءًا من نظام التشغيل Android 3.0 (المستوى 11 من واجهة برمجة التطبيقات)، يمكنك التحكم بشكل أكبر في كيفية استخدام الطبقات ووقت استخدامها باستخدام الطريقة View.setLayerType(). تأخذ واجهة برمجة التطبيقات هذه نسختين المعلمات: نوع الطبقة التي تريد استخدامها وسمة Paint اختيارية يصف كيف ينبغي تركيب الطبقة. يمكنك استخدام المعلمة Paint لتطبيق فلاتر الألوان أو أوضاع المزج الخاصة أو التعتيم على الطبقة الخارجية. يمكن أن تستخدم طريقة العرض نوعًا من أنواع الطبقات الثلاثة:

  • LAYER_TYPE_NONE: يتم عرض العرض بشكل طبيعي ولا يتم الاحتفاظ بنسخة احتياطية منه بواسطة مخزن مؤقت خارج الشاشة. وهذا هو السلوك التلقائي.
  • LAYER_TYPE_HARDWARE: يتم عرض طبقة العرض داخل الأجهزة في بنية الأجهزة إذا تم تسريع التطبيق باستخدام الأجهزة. إذا كان التطبيق ليس جهازًا مسرّع، هذا النوع من الطبقات يتصرف مثل LAYER_TYPE_SOFTWARE.
  • LAYER_TYPE_SOFTWARE: يتم عرض المشهد في البرامج ضمن صورة نقطية.

يعتمد نوع الطبقة التي تستخدمها على هدفك:

  • الأداء: استخدام نوع طبقة جهاز لعرض طريقة عرض على جهاز زخرفة. بمجرد عرض طريقة عرض في طبقة، لا يلزم تنفيذ رمز الرسم الخاص بها حتى يتصل العرض بـ invalidate(). قد تتضمن بعض الرسوم المتحركة، مثل ألفا، يمكن تطبيقها مباشرةً على الطبقة، إلى وحدة معالجة الرسومات.
  • التأثيرات المرئية: استخدِم نوع طبقة الأجهزة أو البرامج مع السمة Paint لتطبيق علاجات مرئية خاصة على إحدى طرق العرض. على سبيل المثال، يمكنك رسم طريقة عرض بالأبيض والأسود باستخدام ColorMatrixColorFilter.
  • التوافق: استخدام نوع طبقة برنامج لفرض عرض طريقة العرض فيها البرامج. إذا كان العرض الذي يتم تسريعه باستخدام الأجهزة (على سبيل المثال، إذا كان العرض بالكامل مع تكامل الأجهزة)، مع مشكلات في العرض، وهذه طريقة سهلة للعمل بشأن قيود عرض الأجهزة المشروع.

عرض الطبقات والرسوم المتحركة

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

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

  • alpha: لتغيير تعتيم الطبقة
  • x وy وtranslationX وtranslationY: يغيّر موضع الطبقة
  • scaleX، scaleY: لتغيير حجم الطبقة
  • rotation وrotationX وrotationY: يؤدي هذا الإجراء إلى تغيير اتجاه الطبقة في الفضاء الثلاثي الأبعاد
  • pivotX، pivotY: تغيير مصدر التحويلات للطبقة

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

Kotlin

view.setLayerType(View.LAYER_TYPE_HARDWARE, null)
ObjectAnimator.ofFloat(view, "rotationY", 180f).start()

Java

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator.ofFloat(view, "rotationY", 180).start();

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

Kotlin

view.setLayerType(View.LAYER_TYPE_HARDWARE, null)
ObjectAnimator.ofFloat(view, "rotationY", 180f).apply {
    addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationEnd(animation: Animator) {
            view.setLayerType(View.LAYER_TYPE_NONE, null)
        }
    })
    start()
}

Java

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        view.setLayerType(View.LAYER_TYPE_NONE, null);
    }
});
animator.start();

لمزيد من المعلومات عن حركة الموقع، اطّلِع على حركة الموقع.

نصائح

يمكن أن يؤدي التبديل إلى رسومات ثنائية الأبعاد مسرَّعة للأجهزة إلى زيادة الأداء على الفور، ولكن تصميم التطبيق لاستخدام وحدة معالجة الرسومات بفعالية من خلال اتباع هذه والتوصيات:

تقليل عدد المشاهدات في تطبيقك
كلما زاد عدد المشاهدات التي يجب أن يرسمها النظام، كان ذلك أبطأ. ينطبق هذا على البرنامج مسار العرض أيضًا. يُعد تقليل المشاهدات إحدى أسهل الطرق لتحسين واجهة المستخدم.
تجنُّب تجاوز الحد الأقصى
لا ترسم عددًا كبيرًا جدًا من الطبقات فوق بعضها. إزالة أي طرق عرض مطابقة تمامًا محجوبة بطرق عرض غير واضحة أعلاها. إذا كنت بحاجة إلى رسم عدة طبقات مدمجة فوقها فكِّر في دمجها في طبقة واحدة. قاعدة مجربة جيدًا مع وجود الجهاز ألا يرسم أكثر من 2.5 مرة عدد وحدات البكسل على الشاشة لكل إطار (وحدات بكسل شفافة في عدد الصور النقطية!).
عدم إنشاء عناصر العرض باستخدام طرق الرسم
أحد الأخطاء الشائعة هو إنشاء عنصر Paint جديد أو Path جديد في كل مرة يتم فيها استدعاء طريقة عرض. يؤدي هذا إلى فرض التخلص من البيانات غير المرغوب فيها تشغيل أكثر من مرة كما يتجاوز أيضًا ذاكرات التخزين المؤقت والتحسينات في الجهاز المشروع.
عدم تعديل الأشكال كثيرًا
على سبيل المثال، يتم عرض الأشكال والمسارات والدوائر المعقدة باستخدام أقنعة الزخرفة. كلّ عند إنشاء مسار أو تعديله، ينشئ مسار الأجهزة قناعًا جديدًا، والذي يمكن مكلف.
لا تعدّل الصور النقطية كثيرًا
في كل مرة يتم فيها تغيير محتوى صورة نقطية، يتم تحميلها مرة أخرى كزخرفة لوحدة معالجة الرسومات في المرة القادمة التي ترسمها فيها.
استخدام ألفا بحرص
عندما تعرض طريقة عرض شبه شفافة باستخدام setAlpha()، AlphaAnimation، أو ObjectAnimator، يتم عرضه في مخزن مؤقت خارج الشاشة مما يؤدي إلى مضاعفة معدل التعبئة المطلوب. عند تطبيق الإصدار الأولي في طرق العرض الكبيرة جدًا، جرّب تعيين نوع طبقة العرض على LAYER_TYPE_HARDWARE