الرسوم المتحركة في Android: كيف تعمل. نحن ندرس الخصائص المفيدة وننشئ رسومًا متحركة على Android
في هذه المقالة سننظر في كيفية تحريك عناصر الواجهة في Android. ضمن عناصر الواجهة في في هذه الحالةوهذا يعني جميع أحفاد فئة العرض (يمكن العثور على قائمة كاملة بالأحفاد في وثائق فئة العرض). الرسوم المتحركة هي طريقة سهلة لجعل التطبيق أكثر حيوية :)
1.
لنبدأ بإنشاء موقع اختبار. لنقم بإنشاء تطبيق بسيط باستخدام زر وصورة في منتصف الشاشة. لن أعطي الكود، إنه بسيط، إذا كان هناك أي شيء، انظر إلى المصادر (وهي موجودة في نهاية المقالة).
2.
في الدليل /res/anim، قم بإنشاء ملف anim.xml واكتب هناك
xml
version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
set
xmlns:android="
http
:
//
schemas.android.com
/apk/res/android
"
android:shareInterpolator="
false
"
>
<
alpha
android:fromAlpha="
0.0
"
android:toAlpha="
1.0
"
android:duration="
1000
"
/>
set
>
هذا هو وصف الرسوم المتحركة الذي سنطبقه على صورتنا. سننظر إلى ما يحدث هنا بمزيد من التفاصيل أدناه، ولكن في الوقت الحالي سنقوم فقط بنسخه إلى ملف.
3.
لتحميل الرسوم المتحركة من ملف XMLمستخدم طريقة ثابتةفئة الرسوم المتحركةUtils
تحميل الرسوم المتحركة (سياق السياق، معرف كثافة العمليات)، أين سياقهو السياق الحالي، و بطاقة تعريف- معرف المورد مع الرسوم المتحركة. تقوم الطريقة بإرجاع مثيل لفئة الرسوم المتحركة.
الرسوم المتحركة - فئة مجردة لتمثيل الرسوم المتحركة في التطبيق.
لتطبيقه، يتم تمرير المثيل الناتج لفئة الرسوم المتحركة إلى الأسلوب
ابدأ الرسوم المتحركة( الرسوم المتحركة الرسوم المتحركة)
عرض الفصل (وجميع أحفاده).
4.
لنكتب إلى ملف AnimationTestActivity.java:
يقوم AnimationTestActivity من الفئة العامة بتوسيع النشاط ( ImageView image; Button Button; Animation anim; @Override protected void onCreate(Bundle saveInstanceState) ( super .onCreate(savedInstanceState); setContentView(R.layout.main); image = (ImageView)findViewById(R. id.image); Button = (Button )findViewById(R.id.button); onClick(View v) ( image.startAnimation(anim); //2 ) ) )
1) اقرأ الملف بالمعرف R.anim.anim (الذي يتوافق مع الملف /res/anim/anim.xml) واحصل على مثيل لفئة الرسوم المتحركة.
2) من خلال النقر على الزر، نقوم بتطبيق الرسوم المتحركة على الصورة.
5. يمكنك إطلاق تطبيقنا. عند الضغط على الزر، ستختفي الصورة ثم تبدأ في الظهور مرة أخرى ببطء.
6.
الآن دعونا نلقي نظرة فاحصة على كيفية إنشاء الرسوم المتحركة في ملف XML.
هناك 4 أنواع من الرسوم المتحركة:
- ألفا(الشفافية، الرؤية)
- حجم(التحجيم)
- استدارة(دور)
- يترجم(يتحرك)
لإنشاء رسوم متحركة، يجب علينا وصف الحالات الأولية والنهائية للكائن، وسيقرر النظام نفسه كيفية الانتقال من حالة إلى أخرى. في مثالنا
<
alpha
android:fromAlpha="
0.0
"
android:toAlpha="
1.0
"
android:duration="
1000
"
/>
نحن نصف الرسوم المتحركة ألفا، أي أننا نغير رؤية الكائن. ضبط الحالة الأولية من ألفا = "0.0"(غير مرئية تماما) ومحدودة إلى ألفا = "1.0"(مرئية بالكامل). حدد مدة الرسوم المتحركة المدة = "1000"(بالميلي ثانية). وكل شيء آخر، أي كيفية تغيير رؤية كائن ما لتحويله من غير مرئي إلى مرئي في ثانية، يقوم به النظام بنفسه. ويتم حساب ذلك باستخدام إقحام- في الرياضيات الحسابية، طريقة لإيجاد القيم المتوسطة لكمية من مجموعة قيم منفصلة موجودة. يمكنك تعيين مُحرف لكل رسم متحرك
-AccelerateDecelerateInterpolator(@android:anim/accelerate_decelerate_int erpolator) - معدل التغيير منخفض في البداية والنهاية، ويتسارع في المنتصف
-AccelerateInterpolator(@android:anim/accelerate_interpolator) - يبدأ معدل التغيير منخفضًا ثم يتسارع
- توقع Interpolator(@android:anim/anticipate_interpolator) - تبدأ التغييرات في الاتجاه المعاكس، ثم تتحرك للأمام بشكل حاد
-توقع التجاوز Interpolator(@android:anim/anticipate_overshoot_inte rpolator) - تبدأ التغييرات في الاتجاه المعاكس، ثم تتحرك بسرعة للأمام وتطير فوق القيمة النهائية، ثم تعود إلى القيمة النهائية
-BounceInterpolator(@android:anim/bounce_interpolator) - يزداد معدل التغيير في النهاية
-CycleInterpolator(@android:anim/cycle_interpolator) - كرر الرسوم المتحركة لعدد محدد من المرات. معدل التغير يتبع موجة جيبية
-تسريع Interpolator(@android:anim/decelerate_interpolator) - ينخفض معدل التغيير في النهاية
- الخطي Interpolator(@android:anim/linear_interpolator) - معدل التغيير ثابت
-OvershootInterpolator(@android:anim/overshoot_interpolator) - تقفز التغييرات للأمام وتطير فوق القيمة النهائية، ثم تعود إلى القيمة النهائية
يتم تحديد interpolator باستخدام سمة android:interpolator. على سبيل المثال
android:interpolator="@android:anim/cycl e_interpolator". الافتراضي هو LinearInterpolator.
7. وصف الحالات الأولية والنهائية
1) ألفا (الشفافية والرؤية)
- أندرويد: من ألفا- قيمة الشفافية الأولية. 0.0 - شفاف تمامًا (غير مرئي)، 1.0 - معتم تمامًا (مرئي)
- الروبوت: إلى ألفا- قيمة الشفافية النهائية
2) حجم
- الروبوت: منXScale- قيمة المقياس الأولية على طول المحور X (حيث يتوافق الحجم الحالي مع القيمة 1.0)
- الروبوت: إلىXScale- قيمة المقياس النهائي على طول المحور X
- الروبوت: من YScale- قيمة المقياس الأولية على طول المحور Y (حيث يتوافق الحجم الحالي مع القيمة 1.0)
- الروبوت: toYScale- قيمة المقياس النهائي على طول المحور Y
- أندرويد:pivotX- إحداثيات x للنقطة، والتي ستبقى دون تغيير بعد القياس
- أندرويد:محوري- إحداثي النقطة، والذي سيبقى دون تغيير بعد القياس
القيم المحتملة لـ PivotX و PivotY:
بالبكسل نسبة إلى الحافة اليسرى (أو العلوية للإحداثي Y) للعنصر (على سبيل المثال، "5")
كنسبة مئوية بالنسبة إلى الحافة اليسرى (العلوية) (على سبيل المثال، "5%")
كنسبة مئوية بالنسبة إلى الحافة اليسرى (العلوية) للعنصر الأصلي (على سبيل المثال، "5%p")
على سبيل المثال، إذا كان PivotX=0، PivotY=0 (الذي يتوافق مع الزاوية العلوية اليسرى للعنصر)، فسيؤدي تغيير الحجم إلى تغيير حجم العنصر إلى الأسفل وإلى اليمين. إذا كان PivotX=50%، PivotY=50%، فإن النقطة تكون في مركز العنصر ويتغير الحجم في كل الاتجاهات، بينما يبقى المركز عند نقطة واحدة.
3) تدور (تدور)
- الروبوت: من الدرجات- القيمة الأولية لزاوية الدوران (بالدرجات، القيمة السلبية ممكنة)
- الروبوت: إلى الدرجات- القيمة النهائية لزاوية الدوران
- أندرويد:pivotX- إحداثيات x مركز الدوران.
- أندرويد:محوري- إحداثي مركز الدوران.
القيم المحتملة لـ PivotX و PivotY كما في الرسم المتحرك للمقياس
4) ترجمة (نقل)
- الروبوت: من XDelta- إحداثيات x لنقطة انطلاق الحركة. القيم الممكنة:
بالبكسل نسبة إلى الموضع الأصلي (على سبيل المثال "5")
كنسبة مئوية بالنسبة لعرض العنصر (على سبيل المثال، "5%")
كنسبة مئوية بالنسبة لعرض العنصر الأصلي (على سبيل المثال "5%p")
- الروبوت: إلىXDelta- إحداثيات x لنقطة نهاية الحركة
- الروبوت: من YDelta- إحداثي نقطة انطلاق الحركة
- الروبوت: toYDelta- إحداثي نقطة نهاية الحركة
8. خيارات إضافية
هناك أيضًا سمات مشتركة بين جميع أنواع الرسوم المتحركة الأربعة، وأكثرها فائدة هي:
- أندرويد: المدة- مدة الرسوم المتحركة (بالميلي ثانية)
- الروبوت: interpolator- يحدد المحرف للرسوم المتحركة
- android:repeatCount- عدد مرات تكرار الرسوم المتحركة الإضافية. بالضبط تلك الإضافية، أي أنه سيتم تنفيذ الرسوم المتحركة مرة واحدة على أي حال. القيمة الافتراضية هي "0" - وهذا يعني أنه سيتم تنفيذ الرسوم المتحركة مرة واحدة فقط. القيمة "1" تعني أن الرسوم المتحركة سيتم تشغيلها مرتين (مرة واحدة رئيسية ومرة ثانوية). القيمة "-1" أو "لا نهائية" تعني التكرار الذي لا نهاية له.
- الروبوت: وضع التكرار- يحدد سلوك الرسوم المتحركة عندما تصل إلى النهاية، والمعلمة RepeatCount لا تساوي 0. هناك قيمتان: "إعادة التشغيل" - تبدأ الرسوم المتحركة مرة أخرى و"عكس" - ستتحرك الرسوم المتحركة بترتيب عكسي .
- android:startOffset- التأخير قبل بدء الرسوم المتحركة (بالميلي ثانية)
9. الجمع بين الرسوم المتحركة المتعددة
يمكنك تطبيق أنواع متعددة من الرسوم المتحركة على عنصر ما في نفس الوقت. فمثلاً لو كتبنا:
xml
version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
set
xmlns:android="
http
:
//
schemas.android.com
/apk/res/android
"
>
<
alpha
android:fromAlpha="
0.0
"
android:toAlpha="
1.0
"
android:duration="
1000
"
/>
<
rotate
android:fromDegrees="
0
"
android:toDegrees="
360
"
android:pivotX="
50%
"
android:pivotY="
50%
"
android:duration="
1000
"
/>
set
>
ستتغير الصورة شفافيتها خلال ثانية واحدة (من شفافة تمامًا إلى معتمة) وفي نفس الوقت ستدور بمقدار 360 درجة.
يمكن ضبط الرسوم المتحركة على فترات مختلفة، على سبيل المثال، دعنا نضبطها المدة=5000لتدوير الرسوم المتحركة. الآن سيتم تدوير الصورة بشكل أبطأ بكثير، وستظل الشفافية تتغير خلال ثانية واحدة.
باستخدام startOffset، يمكنك جعل الرسوم المتحركة متسلسلة. أضف سمة التدوير بداية الإزاحة = "1000"(أي أننا سنجعل التأخير مساويًا لمدة الرسوم المتحركة الأولى). الآن ستصبح الصورة مرئية لأول مرة خلال ثانية واحدة، ثم يتم تدويرها 360 درجة فقط.
يمكن دمج العديد من الرسوم المتحركة في مجموعات باستخدام العلامة. ستكون إحدى هذه العلامات موجودة دائمًا في الملف وهي العلامة الجذر. يمكنك تعيين السمات التالية لمجموعة:
- مدة(مدة)، كرر الوضع(وضع التكرار) - سيتم تطبيق هذه السمات على كل رسم متحرك في المجموعة
- interpolator- يحدد الرسوم المتحركة المحرف و com.shareInterpolator- ما إذا كان سيتم تطبيق هذا المحرف على كل رسم متحرك في المجموعة (القيم المحتملة هي "صحيح" و"خطأ")
- startOffset(تأخير) - تأخير لمجموعة الرسوم المتحركة بأكملها.
لسوء الحظ، لا يمكن تطبيق السمة على المجموعة تكرار العدأي أن تكرار مجموعة من الرسوم المتحركة عدة مرات لن ينجح.
يمكن أن تكون المجموعات من أي تعشيش.
10. إنشاء رسوم متحركة بدون XML
يمكن إنشاء الرسوم المتحركة دون استخدام XML، مباشرة في رمز البرنامج. لهذا، يتم استخدام الفئات التابعة للرسوم المتحركة:
1) AlphaAnimation لإنشاء رسوم متحركة ألفا. يبدو منشئ الفصل
الرسوم المتحركة ألفا (تطفو من ألفا، تطفو إلى ألفا)حيث fromAlpha وtoAlpha هما قيمتي الشفافية الأولية والنهائية، على التوالي (من 0.0 إلى 1.0)
11.
لنقم بإنشاء رسم متحرك في الكود، والذي، عند الضغط على زر، سوف يقوم بتدوير الصورة بزاوية عشوائية (من 0 إلى 360) ويقوم بتكبيرها إلى حجم عشوائي (ليس أكثر من مرتين). ولهذا الغرض أضفت زرًا آخر عشوائيًا
بشكل عشوائي. RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); //2 Rotate.setDuration(1000); ); //6 حجم العائمة = عشوائي.nextFloat() + 1.0; //8scale.setDuration(1000);scale.setStartOffset(duration); //9 AnimationSet = new AnimationSet; );
1) إنشاء كائن عشوائي لتوليد أرقام عشوائية. يمكنك قراءة المزيد عن Random في الوثائق، ونحن الآن مهتمون بطرق int nextInt(int n) - إنشاء عدد صحيح في النطاق من 0 إلى n. وطريقة float nextFloat() - توليد رقم حقيقي من 0 إلى 1.
2) إنشاء الرسوم المتحركة التناوب. زاوية البداية = 0، زاوية النهاية = رقم عشوائي من 0 إلى 360. الرسوم المتحركة.RELATIVE_TO_SELF تعني أننا سنحدد نقطة مركز الدوران كنسبة مئوية بالنسبة لعرض العنصر. لا تنس أن القيمة 1.0 تقابل 100%، مما يعني أن 0.5f تساوي 50%. وهذا يعني أن مركز نقطة الدوران سيكون في منتصف الصورة.
3) اضبط مدة الرسوم المتحركة على 1000 مللي ثانية (هذه ثانية واحدة)
4) نحدد وضع التكرار على أنه رسوم متحركة. عكس، أي أنه عند تكرار الرسوم المتحركة، سنذهب بالترتيب العكسي.
5) قم بتعيين عدد التكرارات الإضافية = 1. وهذا يعني أنه سيتم تكرار الرسوم المتحركة مرتين، مرة في الترتيب الأمامي ومرة في الاتجاه المعاكس.
6) تحسب طريقة computeDurationHint() الطويلة المدة التي ستستغرقها الرسوم المتحركة بشكل إجمالي. توجد طريقة getDuration()، ولكنها تقوم ببساطة بإرجاع قيمة المدة التي قمنا بتعيينها باستخدام طريقة setDuration(). في حالتنا، قمنا بتعيين قيمة المدة على 1000 وستعيد طريقة getDuration() 1000 ولن تأخذ في الاعتبار أن الرسوم المتحركة ستتكرر مرتين، مما يعني أنها ستستمر فعليًا 2000 مللي ثانية. ستقوم طريقة computeDurationHint() بحساب المدة مع مراعاة عمليات إعادة المحاولة والتأخير.
7) حساب الحجم الجديد للصورة. القيمة 1.0 هي مقياس الصورة الحالي، وبالتالي فإن القيمة 2.0 تعني أن الصورة مضاعفة. نقوم بإنشاء رقم من 0.0 إلى 1.0 ونضيف 1، مما يعني أننا نحصل على رقم من 1.0 إلى 2.0
8) قم بإنشاء رسم متحرك للتحجيم من حجم الصورة الحالي إلى رقم تم إنشاؤه عشوائيًا من 1.0 إلى 2.0
9) قم بتعيين تأخير يساوي المدة الإجمالية للرسوم المتحركة للتدوير. بحيث تبدأ الرسوم المتحركة الثانية مباشرة بعد نهاية الأولى
10) إنشاء مجموعة من الرسوم المتحركة.
11) أضف اثنين من الرسوم المتحركة التي تم إنشاؤها إلى المجموعة
12) تطبيق مجموعة من الرسوم المتحركة على الصورة
12.
طريقة أخرى مثيرة للاهتمام لفئة الرسوم المتحركة
setAnimationListener (Animation.AnimationListener المستمع)- يضبط المستمع لتغييرات حالة الرسوم المتحركة. تحدد واجهة Animation.AnimationListener الطرق التالية:
onAnimationStart (الرسوم المتحركة الرسوم المتحركة)- يتم استدعاؤه عند بدء الرسوم المتحركة
onAnimationRestart (رسوم متحركة)- يتم استدعاؤه عند تكرار الرسوم المتحركة
onAnimationEnd (الرسوم المتحركة الرسوم المتحركة)- يسمى في نهاية الرسوم المتحركة
على سبيل المثال:
anim = AnimationUtils.loadAnimation(this, R.anim.anim); anim.setAnimationListener(new AnimationListener () ( @Override public void onAnimationEnd(Animation Animation) ( Log.d("MY" , "animation end" );) @Override public void onAnimationRepeat(Animation Animation) (Log.d("MY" " ، "تكرار الرسوم المتحركة" ); ) @Override public void onAnimationStart(Animation Animation) ( Log.d("MY" , "animation start" ); ) ));
نحن لا نفعل أي شيء مفيد عند تغيير حالة الرسوم المتحركة، بل نكتبها فقط في السجل.
هذا كل شئ. لقد أخبرتك بالأساسيات، ومن الأفضل أن تتعلم الباقي من خلال التجارب :)
يمكن تحميل المصادر هنا
تعيين الأنابيب المعدنية. دعونا نلقي نظرة على تسميات خطوط الأنابيب المعدنية الأكثر شيوعًا وفقًا لـ GOST. أنابيب المياه والغاز الفولاذية وفقًا لـ GOST يشير تعيين الأنبوب إلى القطر الاسمي والطول (عند استخدام الأنابيب ذات الطول المقاس) وسمك الجدار. لنفكر في مثال على تعيين أنبوب بقطر اسمي 32 مم، وسمك جدار 2.8 مم، بدون طلاء الزنك: الأنابيب 32x2.8 GOST يُشار إلى وجود طلاء الزنك بالحرف C، الذي يتم وضعه بعد كلمة "الأنابيب".
إذا لزم الأمر، تتم الإشارة إلى علامة تشير إلى وجود المواضيع في تعيين الأنابيب. يتم وضع علامات على الأنابيب الفولاذية وفقًا لـ GOST في المصنع بعد الإنتاج وتحتوي على معلومات حول حجم ودرجة الفولاذ الذي صنع منه الأنبوب، بالإضافة إلى العلامة التجارية للشركة المصنعة. يتناسب حجم حروف وأرقام العلامة التجارية بشكل مباشر مع حجم المنتج ويمكن تطبيقها باستخدام عدة طرق.
الأكثر شيوعا هي العلامات التجارية والطلاء المقاوم للماء. تتم مناقشة أنواع التحكم وتعيينها في وضع العلامات على المنتج في الجدول (الجدول)؛ العنصر التالي"" تشير إلى سمك الجدار بالملليمتر؛ تشير القيمة الرابعة إلى طول المنتج بالملليمتر من القطع إلى القطع، وفي هذه الحالة يكون "".
كيفية فك علامات الأنابيب الفولاذية: القطر ودرجة الفولاذ والمؤشرات الأخرى وفقًا لـ GOST. الرموز المطبوعة على الأنابيب الفولاذية تعطي معلومات شاملةحول المنتجات.
يعد وضع العلامات نوعًا من جواز سفر المنتج الذي يتضح من خلاله من وأين ولأي غرض تم تصنيعه. ستخبرك هذه المقالة بكيفية فك رموز جميع رموز العلامات على الأنابيب بشكل صحيح.
ملحوظة. يتم تنظيم وضع علامات على الأنابيب الفولاذية (والحديد الزهر) بموجب GOST رقم العام. تحدد هذه الوثيقة جميع الفروق الدقيقة في تطبيق النقوش التوضيحية وأحجامها والمسافات بين الأرقام وما إلى ذلك.
أنابيب فولاذية غير ملحومة مشوهة على البارد GOST (تشكيلة) هذا المعيارينطبق على الأنابيب غير الملحومة المشكلة على البارد هدف عاممصنوعة من الكربون وسبائك الصلب. الأقطار: 5 - ملم. في رموز الأنابيب، يتم وضع المؤشر A أو B قبل درجة الفولاذ. يتم تصنيع الأنابيب إما معالجة بالحرارة أو بدون معالجة حرارية.
يجب قطع نهايات الأنابيب بزاوية قائمة. طرق وضع علامات على الأنابيب الفولاذية: معايير GOST، أمثلة على فك التشفير حرف او رمز. من خلال قراءة الأرقام الموجودة على المنتج، يستطيع المتخصص تحديد حجم الأنبوب ونوعه ودرجة الفولاذ والقوة والشركة المصنعة وبعض المعالم الأخرى للمنتج.
وضع علامات على الأنابيب الفولاذية غرض خاصيحتوي على علامات إضافية. تشمل المنتجات ذات الأغراض الخاصة ما يلي: الأنابيب المصنوعة من سبائك الصلب. 4. المراجع الوثائق التنظيمية والفنية. تسمية NTD. الذي يتم إعطاء الرابط. W s g -80 GOST yu S1 رقم العنصر. التغيير رقم 2 GOST - 91 أنابيب فولاذية ملحومة بالكهرباء.
التشكيلة المعتمدة من قبل المجلس المشترك بين الولايات للمعايير والمقاييس وإصدار الشهادات عن طريق المراسلة (البروتوكول رقم 45 بتاريخ) مسجلة من قبل مكتب رقم معايير الاتحاد الجغرافي الدولي. صوتت هيئات التقييس الوطنية في الولايات التالية لصالح اعتماد التغيير: BY، KG ، RU، TJ [رموز ألفا 2 وفقًا لـ MK (ISO)].
بيع وشراء. تعيين أنابيب الصلب. أنابيب فولاذية ملحومة كهربائياً ذات التماس المستقيم. تشكيلة. دار نشر GOST IPK بالمعايير. معيار الدولة لاتحاد الجمهوريات الاشتراكية السوفياتية. أنابيب الصلب الملحومة كهربائيا التماس المباشر. مع زخرفة. زيوت خط اللحام الفولاذية الملحومة كهربائياً. يتراوح. GOST تاريخ التقديم 1. تحدد هذه المواصفة القياسية مجموعة من الأنابيب الفولاذية الملحومة كهربائيًا ذات التماس المستقيم.
2. يجب أن تتوافق أبعاد الأنابيب مع الجدول. 1. 3. وفقًا لطول الأنبوب، يتم تصنيعها: بطول غير مُقاس. تحديد الوثائق العلمية والتقنية المشار إليها. رقم الشيء. غوست
فئاتآخر الملاحةيوم جيد للجميع. أريد أن أخصص هذا المنشور لموضوع الأجزاء لنظام Android. توجد بالفعل ترجمات وبعض المقالات حول حبري، والتي تشير إلى كيفية بدء العمل مع الأجزاء لنظام Android. على سبيل المثال، المادة. يحتوي على وصف لما هي الأجزاء وفي أي إصدار من Android تتوفر، لذلك يمكن لأولئك الذين لم يصلوا إليها بعد قراءتها إذا رغبوا في ذلك، لكنني لن أعيد سرد هذا في رسالتي. لذلك سأدخل مباشرة في صلب الموضوع.
بداية العمل
اسمحوا لي أن أقول باختصار أن الأجزاء هي مكونات واجهة مستخدم المستخدم التي يمكن استخدامها باستخدام فئة النشاط لعرض بيانات المستخدم، ولكنها دورة الحياةلا يعتمد عليه. تتمتع الوظائف التي توفرها الأجزاء بوظائف أوسع للعمل معها من النشاط، لذا فإن استخدامها ليس له أهمية كبيرة للمطورين إذا كانوا يريدون أن يحتوي تطبيقهم على واجهة مستخدم أكثر حداثة وفقًا لمعايير اليوم.الآن دعونا نصل إلى جوهر هذا المنصب. مطورو جوجلتم منح الأجزاء، في رأيي، دعمًا ممتازًا للرسوم المتحركة لعرض الجزء نفسه. سيتم مناقشة هذا بمزيد من التفصيل. لقد بحثت في حبر عن منشورات حول هذا الموضوع، لكنني لم أجد أي شيء، والآن سأشارك معرفتي.
إنشاء مشروع
دعونا ننشئ مشروعًا صغيرًا. لقد أنشأت مشروعًا خاصًا بي سامسونج نيكزس S، لدي إصدار Android 4.1.2 هناك، وهو ما استخدمته بالفعل (Api Level 16). لقد أطلقت على المشروع نفسه اسم FragmentsAnimationTest.بالنسبة للعرض التوضيحي، سنحتاج إلى النشاط الرئيسي وتخطيطه، واثنين من الأجزاء، لكل منها تخطيطها الخاص، واثنين من ملفات XML للرسوم المتحركة نفسها، والتي سأتحدث عنها لاحقًا.
سيبدو التطبيق كما يلي: سيتم عرض إحدى الأجزاء على الشاشة، وسيتم التبديل بينها باستخدام الزر العادي، وبالتالي، فإن تبديل الأجزاء نفسها سيكون مصحوبًا بتأثيرات الرسوم المتحركة.
أولاً، لنرتب عناصر النشاط الرئيسي في ملفactiv_main.xml:
من الكود، يمكنك أن ترى أنه يتم استخدام التخطيط الرئيسي - RelativeLayout، وهو مناسب تمامًا عند العمل مع الأجزاء؛ يتم وضع عنصرين قياسيين من FrameLayout فيه - في الواقع، سيكون عبارة عن حاوية للأجزاء وزر سيتم استخدامه. لتبديل الأجزاء فيما بينها. في الوقت الحالي، يجب أن يكون كل شيء بسيطًا للغاية.
بعد ذلك، دعنا ننتقل إلى شظايانا. لنقم بإنشاء ترميز لهم وللفئات نفسها:
fragment1.xml
جزء2.xml
بالنسبة لكلا الجزأين، يكون الرمز هو نفسه تقريبًا، والفرق الوحيد هو النص الذي سيتم عرضه في الجزء نفسه للتعرف عليه ولون الخلفية بحيث تكون الرسوم المتحركة مرئية بوضوح.
Fragment1.java
الطبقة العامة Fragment1 توسع الجزء ( @Override public View onCreateView(LayoutInflater inflater, ViewGroup Container, Bundle saveInstanceState) ( return inflater.inflate(R.layout.fragment_1, null); ) )
Fragment2.java
الطبقة العامة Fragment2 تمتد Fragment( @Override public View onCreateView(LayoutInflater inflater, ViewGroup Container, Bundle saveInstanceState) ( return inflater.inflate(R.layout.fragment_2, null); ) )
في الفصول الدراسية، يجب أن يكون كل شيء واضحًا أيضًا إذا كنت معتادًا على موضوع الأجزاء. إنها تشير ببساطة إلى الإجازة الدقيقة التي سيتم استخدامها عند عرض جزء معين وهذا كل شيء.
الآن دعونا نصل إلى الجزء اللذيذ. دعونا نعمل مع فئة النشاط الرئيسية، وهذا هو رمزها:
يقوم MainActivity من الفئة العامة بتوسيع النشاط (جزء خاص fragment2؛ جزء خاص fragment1؛ خاص FragmentTransaction ft؛ @Override protected void onCreate(Bundle saveInstanceState) (super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragment1 = new Fragment1() fragment2 = new Fragment2(); ft = getFragmentManager().beginTransaction(); ft.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right); ft.commit(); Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener() ( @Override public void onClick(View v) ( ft = getFragmentManager().beginTransaction(); ft. setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right); // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ( ft.replace(R.id.fragCont, fragment1); ) ft.commit(); ) )); ))
دعونا نلقي نظرة على ما يحدث بالضبط في نشاطنا. أولا، يتم إنشاء كلا الشظايا، والتي، كما ذكرنا بالفعل، ستغير بعضها البعض بالتناوب. بعد ذلك، نشير بالسطر ft = getFragmentManager().beginTransaction() إلى أننا نحصل على FragmentTransaction، والذي يمكننا من خلاله التفاعل مع الأجزاء الخاصة بنا، ولكن هذا كله في المقالة التي ذكرتها سابقًا. قبل الانتقال إلى تحليل الكود التالي، سأقوم باستطراد صغير.
هناك خياران لإنشاء رسوم متحركة لعرض الأجزاء:
- الطريقة الأولى هي توصيل الرسوم المتحركة القياسية باستخدام طريقة setTransition(int Transition). تحتوي فئة FragmentTransaction على العديد من الرسوم المتحركة المحددة مسبقًا.
- الطريقة الثانية هي بالضبط ما يهمنا في هذا الموضوع، وهي تنفيذ الرسوم المتحركة المخصصة. تم ذلك باستخدام طريقة setCustomAnimations()
هناك بعض التعليقات المخصصة حتى تتمكن من محاولة اللعب بالرسوم المتحركة الموصوفة مسبقًا، ما عليك سوى إلغاء التعليق عليها والتعليق على السطر السابق - ft.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right)، في كلتا الحالتين، بالرغم من ذلك هذا ليس ضروري.
دعنا نحلل رمز النشاط حتى النهاية وننتقل إلى إنشاء الرسوم المتحركة نفسها.
بعد تعيين الرسوم المتحركة، يتم عرض الجزء وإضافته إلى المكدس وإكمال المعاملة لعرض جميع التغييرات. ثم نقوم بتهيئة الزر الخاص بنا وإرفاق مستمع حدث النقر عليه، والذي يوجد بداخله رمز لتغيير الأجزاء. عند الضغط على الزر، نبدأ معاملة، ونربط الرسوم المتحركة ونغير الجزء إلى الجزء المقابل الموضح في حالياً. الكود بسيط، لذلك لا يتطلب شرحًا عميقًا.
إنشاء الرسوم المتحركة
دعنا ننتقل إلى الجزء الرئيسي من موضوعنا. دعونا نتعلم كيفية إنشاء الرسوم المتحركة نفسها. تختلف الطريقة التي ننشئ بها الرسوم المتحركة هنا قليلًا عما اعتدنا عليه في الإصدارات السابقة من Android. التنفيذ يسير على النحو التالي. تحتاج أولاً إلى إنشاء مجلد الرسوم المتحركة في مجلد موارد التطبيق، وسيبدو بهذا الشكل - res/animator/. يجب علينا هنا وضع ملفات xml التي تصف بالضبط كيفية تشغيل الرسوم المتحركة. دعونا نضعهم هناك:Slide_in_left.xml
وslide_in_right.xml
الآن دعونا ننظر إليهم بالتفصيل. يتم وصف عناصر التأثيرات المرئية نفسها في علامة objectAnimator؛ وتصف كل علامة وصفًا لتأثير الرسوم المتحركة الجديد. الآن دعونا نلقي نظرة على السمات نفسها. السمة الأولى في ملف Slide_in_left.xml هي interpolator، ولها عدة قيم، يمكنك معرفة المزيد عنها في وثائق Property Animation. Interpolator هو المسؤول عن التقديم بطريقة معينةلفترة معينة جزء لدينا. بعد ذلك، لدينا خاصية propertyName، وهي تشير إلى خاصية الجزء الذي سنغيره أثناء الرسوم المتحركة؛ في مثالنا، تأتي y أولاً، وتشير valueType إلى نوع المعلمة التي نقوم بتغييرها. في هذا الكتاب برو أندرويد 4 يتم تفسير هذا الموقف من خلال حقيقة أنه إذا نظرت إلى طريقة setX () في فئة العرض، يصبح من الواضح أنها تأخذ قيمة من النوع العائم، وينطبق الشيء نفسه على طريقة setY ()، ومن هنا قيمة floatType.
بعد ذلك، تأتي السمات غير المهمة valueFrom وvalueTo، فهي تشير إلى القيمة التي سيتم تغيير القيمة المحددة في propertyName منها، وفي حالتنا الأولى كانت y. إذا لم يتم تحديد المعلمة valueFrom، فسيتم أخذ القيمة مساوية للقيمة الحالية. في حالتنا valueFrom تساوي -1280، هذا يعني أن حركة القطعة على طول المحور y ستبدأ من القيمة -1280، وقد تم اختيار هذه القيمة نظرًا لتواجدها خارج شاشة الجهاز والحركة سيحدث حتى تصبح قيمة y مساوية 0 للزاوية اليسرى العليا لجزءنا لمدة 1500 مللي ثانية. وأخيرًا، تحدد سمة المدة بالضبط المدة التي سيستمر فيها تأثيرنا المتحرك بالمللي ثانية.
والفارق الدقيق الأخير الذي أريد وصفه. بالنظر إلى أي من ملفات وصف الرسوم المتحركة، يمكنك رؤية علامة المجموعة، التي تحتوي على جميع تأثيرات الرسوم المتحركة التي تعمل على دمج التأثيرات أو فصلها. يستخدم ملف Slide_in_right.xml خاصية الطلب في علامة المجموعة، في حالتنا له القيمة معًا، مما يعني تشغيل التأثيرات في وقت واحد، مقابل ذلك هناك القيمة بشكل تسلسلي، مما يتطلب عرض التأثيرات بشكل تسلسلي في الرسوم المتحركة، وهي مريحة للغاية في بعض الحالات.
هذا كل شئ. يوفر الملف Slide_in_right.xml مثالاً لكيفية استخدام الخصائص الأخرى للرسوم المتحركة، مثل قناة ألفا. يأمل هذا المقالمفيد لأولئك الذين يهتمون بالشكل الذي سيبدو عليه تطبيقهم.
كما تفهم بنفسك، عزيزي هابروزر، لن تتمكن لقطات الشاشة من عرض نتيجة العمل.
تم ذكر الأدبيات والمصادر التي تم استخدامها عند كتابة المنشور خلال المقال نفسه.
بدءًا من Android 4.4، أضاف المطورون أداة إضافيةلإنشاء الرسوم المتحركة - إطار التحولات. كان الهدف في الأصل إنشاء رسوم متحركة لتغيير حالة التطبيق من خلال معالجة طرق عرض متعددة. مع إصدار Android 5.0، تم توسيع مجموعة الرسوم المتحركة المتاحة للاستخدام لتتوافق مع مفهوم تصميم المواد الذي تم تقديمه في نفس الوقت.
يسمح لك Transitions Framework بالإنشاء بسرعة وبدون ألم الرسوم المتحركة المختلفة. لذلك، أثناء العمل على iFunny، كان من المستحيل تجاهل مجموعة الأدوات هذه. القراء مدعوون ل حالة خاصةاستخدام Transitions API - إنشاء رسوم متحركة للانتقال بين النشاط بتأثير "سلس".
من وجهة نظر مرئية، يمكن تقسيم الرسوم المتحركة الانتقالية بين الأنشطة المقدمة في إطار عمل التحولات إلى نوعين: الرسوم المتحركة العادية والرسوم المتحركة ذات العنصر المشترك. يتم توضيح مفهوم الرسوم المتحركة مع عنصر مشترك في الشكل المسروق بصدق من Developer.android.com. 1. العناصر المشتركة فيه هي الصورة الرمزية واسم جهة الاتصال.
أرز. 1. الرسوم المتحركة للانتقال بين النشاط مع العناصر المشتركة
ولكن لا أحد يحب المقدمات الطويلة، لذلك دعونا ننتقل مباشرة إلى قصة كيفية إنشاء الرسوم المتحركة من هذا النوعفي تطبيق iFunny. كمثال أول، فكر في الرسوم المتحركة الموضحة في الشكل. 2. لاستخدامه نحتاج إصدارات أندرويد 5.0 وما فوق.
أرز. 2. رسوم متحركة للانتقال بين النشاط على شاشة مصادقة المستخدم
من وجهة نظر المستخدم، لا يوجد شيء غير عادي هنا: شاشة واحدة، رسوم متحركة بسيطة. ولكن، كما كنت قد خمنت، "تحت الغطاء" هو الانتقال بين شاشتين مع عنصر مشترك واحد.
من الغريب أن الخطوة الأولى لإنشاء مثل هذا الانتقال هي اختيار هذا العنصر وتحديد موقعه في مخطط كلا النشاطين. بعد ذلك، تحتاج إلى إضافة سمة android:transitionName إلى وصف كل طريقة عرض تعرض العنصر المحدد، وكذلك تعيين android:id لها إذا كانت مفقودة.
في حالتنا، هذه هي طرق عرض الصور العادية بالشكل التالي:
هناك شيئان جديران بالملاحظة هنا نقاط مهمة. أولاً، يجب تعيين كل من ImageViews على نفس اسم الانتقال، وهو أمر منطقي. ثانيًا، نظرًا لأننا نستخدم ImageView، فيجب أن تكون محتوياتها هي نفسها، نظرًا لأن استخدام مصدرين مختلفين يمكن أن يؤدي إلى عواقب غير متوقعة (على الأقل وميض العرض المتحرك في بداية الرسوم المتحركة ونهايتها).
في الخطوة الثانية، تحتاج إلى إضافة خيارات للنشاط الذي تم إطلاقه (الثاني)، مع الإشارة إلى أنه يجب تشغيل الرسوم المتحركة عند بدايتها.
ملحوظة.نعني بكلمة "ثانيًا" النشاط الذي تم إطلاقه، والذي يجب تنفيذ الانتقال إليه، ونعني بكلمة "أولاً" نشاط الإطلاق.
هذا يفعل كما يلي:
حزمة الحزمة = فارغة؛ إذا (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) ( عرض v =activity.findViewById(R.id.auth_logo); if (v != null) ( ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity , v,activity.getString(R.string.email_auth_transition)); Bundle = options.toBundle() ) ) Intent Intent = new Intent(activity, SecondActivity.class); إذا (حزمة == فارغة) (activity.startActivity(intent);) آخر (activity.startActivity(intent, Bundle);)
في القائمة التالية:
- R.id.auth_logo - ImageView من النشاط الأول، يُستخدم في الرسوم المتحركة؛
- النشاط - النشاط الأول؛
- R.string.email_auth_transition - تسمية تم تركها مسبقًا في تخطيط كل من ImageViews؛
- SecondActivity.class - النشاط الثاني.
في الخطوة الثالثة، من الضروري وصف الرسوم المتحركة الانتقالية، أي. تشير إلى المسار الذي تم اجتيازه بواسطة العرض المتحرك وتحويل العرض نفسه. لهذا سوف نقوم بإنشاء ملف منفصل projectName/src/main/res/transitions/email_auth_transition.xml بالمحتوى التالي:
القليل من النظرية. تهدف علامة TransitionSet إلى وصف العديد من التحويلات المطبقة على العرض المتحرك مرة واحدة. تتحكم معلمة TransitionOrdering في الترتيب الذي يتم به تطبيق هذه التحويلات. وفي حالتنا، يتم تطبيقها في وقت واحد. هناك عدة أنواع من التحويلات المعدة مسبقًا المتوفرة في إطار عمل التحولات. مع القائمة الكاملةيمكن العثور عليها في هذه الصفحة. سنركز على اثنين محددين: ChangeBounds وchangeImageTransform.
الأول هو لتحويل حجم العرض. يعمل الثاني فقط مع ImageView، وبالتزامن مع الأول، يسمح لك بتغيير ليس فقط الحجم، ولكن أيضًا شكل ImageView. باستخدام بيانات التحويل، نحصل على الرسوم المتحركة الناتجة لتغيير حجم الصورة، كما هو موضح في الشكل. 2. إذا لم تحدد نوع حركة العرض المتحرك، فسوف يتحرك على طول أقصر مسار. دعونا نلقي نظرة على طريقة نقل أكثر إثارة للاهتمام في المثال الثاني.
الخطوة الأخيرة في إنشاء الرسوم المتحركة هي الإعلان عنها في موضوعات كلا النشاطين. للقيام بذلك، قم بتحرير وصف السمات على النحو التالي (أو قم بإنشاء سمات جديدة في المجلد projectName/src/main/res/values-v22/theme.xml):
هنا:
- android:windowActivityTransitions تمكن الرسوم المتحركة الانتقالية؛
- android:windowSharedElementEnterTransition يشير إلى ملف يصف الرسوم المتحركة للانتقال من النشاط الأول إلى الثاني؛
- android:windowSharedElementExitTransition يشير إلى ملف يصف الرسوم المتحركة للانتقال عند العودة من النشاط الثاني إلى الأول.
لذلك، لإنشاء رسم متحرك للانتقال من نشاط إلى نشاط، تحتاج إلى:
- وصف الرسوم المتحركة (في حالتنا في ملف XML)؛
- أضف هذه الرسوم المتحركة إلى وصف XML لموضوع النشاط؛
- قم بتمييز العنصر المشترك المتحرك (العرض) في الترميز؛
- عند تشغيل النشاط الثاني، حدد في معلمات التشغيل ما يحتاجه لتمكين الرسوم المتحركة الانتقالية.
أرز. 3. الرسوم المتحركة للانتقال من التعليقات إلى ملف تعريف المستخدم
تنطبق جميع خطوات الانتقال التي تمت مناقشتها أعلاه أيضًا على هذه الرسوم المتحركة. وهنا التحول عنصر مشتركنفذت بشكل مختلف قليلا. تصف القائمة أدناه نقل عنصر عام "على طول قوس" أثناء تغيير حجمه.
ما مدى صعوبة المثال الثاني؟ في الحالة الأولى، تم استخدام صورة من موارد التطبيق نفسه، ولكن هنا يتم تنزيل الصورة من الشبكة. بالإضافة إلى ذلك، بالنسبة للتعليقات، يتم التقاط الصورة الرمزية للمستخدم بدقة أقل من الملف الشخصي. لذلك، من الضروري ليس فقط منح النشاط الثاني إمكانية الوصول إلى الصورة المستخدمة في النشاط الأول، ولكن أيضًا تحميل الصورة المطلوبة بجودة أعلى عند الانتهاء من الرسم المتحرك. وهذا يخلق مشكلتين.
لحل المشكلة الأولى، يمكنك تخزين الصورة مؤقتًا على القرص بنفسك أو تمرير عنوانها في معلمة النشاط الثاني. ومع ذلك، تم نقل حل هذه المشكلة إلى المكتبة المستخدمة في تطبيق تحميل الصور - Glide. عند تحميل صورة، ما عليك سوى إضافة معلمة diskCacheStrategy(DiskCacheStrategy.SOURCE)، وسيتم تخزينها مؤقتًا بواسطة المكتبة نفسها (ذات الصلة بالإصدار 3.x من Glide). لذلك، عند الوصول إلى هذا المورد مرة أخرى من النشاط الثاني، سيتم استخدام الملف المخزن مؤقتًا، مما سيساعدنا على تجنب وميض ImageView المتحرك.
تم حل المشكلة الثانية أيضًا بكل بساطة. أثناء تنفيذ الرسوم المتحركة للانتقال، يتم تنزيل ملف تعريف المستخدم مع الصورة الرمزية بدقة أعلى من الشبكة وينتظر اكتماله. بمجرد استيفاء كلا الشرطين (اكتمال الرسوم المتحركة واكتمال التحميل)، يتم تحديث الصورة الرمزية للمستخدم. يمكنك تحقيق هذا السلوك إذا كنت تستخدم مستمعًا خاصًا، والذي ينفذ عمليات رد الاتصال التي يتم استدعاؤها عندما تتغير حالة الحركة. للقيام بذلك، في الجزء الذي ينتمي إلى النشاط الثاني، سنقوم بتعيين نفس المستمع:
@Override public void onViewCreated(View view, @Nullable Bundle saveInstanceState) ( super.onViewCreated(view, saveInstanceState); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) ( getActivity().getWindow( .getSharedElementEnterTransition() .addListener(mEnterTransitionListener) setAvatar();
إليك ما يحدث:
- باستخدام getSharedElementEnterTransition().addListener()، يتم تعيين المستمع لتحريك مظهر النشاط؛
- تحاول طريقة setAvatar() تحميل وتثبيت الصورة الرمزية (الموجودة بالفعل في ذاكرة التخزين المؤقت).
Private Transition.TransitionListener mEnterTransitionListener = new Transition.TransitionListener() ( @Override public void onTransitionStart(Transition Transition) ( ) @Override public void onTransitionEnd(Transition Transition) ( onProfileUpdated(); ) @Override public void onTransitionCancel(Transition Transition) ( ) @Override public void onTransitionPause(Transition Transition) ( ) @Override public void onTransitionResume(Transition Transition) ( ) );
في طريقة onProfileUpdated() نقوم بتحديث محتويات الملف الشخصي، بما في ذلك. والصورة الرمزية.
تجدر الإشارة بشكل منفصل إلى الحالة التي يخرج فيها عنصر مشترك عن الشاشة. تكمن خصوصيتها في أنه، على عكس (أو ربما وفقًا لـ) المنطق، سيظل يتم تنفيذ الرسوم المتحركة الانتقالية وستبدو مضحكة جدًا (الشكل 4).
أرز. 4. الرسوم المتحركة للعودة من الملف الشخصي إلى التعليقات
لتجنب هذا السلوك، يكفي ضبطه على رؤية أخرى غير View.VISIBLE عندما يغادر العنصر المشترك الشاشة.
بشكل عام، يمكننا القول أن Transitions Framework هي أداة بسيطة وقوية لإنشاء الرسوم المتحركة. لا يقتصر الأمر فقط على الرسوم المتحركة الانتقالية بين النشاط - تعتبر المقالة فقط حالة خاصة لاستخدامها. ومن الجدير بالذكر أيضًا أنه بالإضافة إلى التحولات المقدمة، من الممكن إنشاء الخاصة بك، ولكن هذه قصة مختلفة تمامًا، وتستحق مقالًا منفصلاً.
ملاحظة. ويمكنك أن تقرأ عن كيفية اختراع الرسوم المتحركة لـ iFunny.
العلامات:
- ذكري المظهر
- تصميم المواد
منذ بعض الوقت، أصبح من الممكن في Android استخدام موارد المتجهات بدلاً من شرائح png. ظهرت هذه الفرصة مع إصدار Android 5.0 Lollipop وAPI 21. بالنسبة للإصدارات السابقة من النظام، يمكننا استخدام AppCompat (مكتبة التوافق)، والتي بفضلها سيعمل ناقل ثابت مع API 7 (Android 2.1)، ومتجه متحرك مع API 11 (أندرويد 3.0 قرص العسل).
تشغل موارد المتجهات، على عكس التقطيع التقليدي، مساحة أقل بحوالي 10 مرات. ليست هناك حاجة لتكييف الرسومات مع كثافات الشاشة المختلفة. بالإضافة إلى ذلك، يمكنك إعادة استخدام المورد في سياقات وأحجام وألوان مختلفة.
ميزة أخرى مهمة هي القدرة على إضافة الرسوم المتحركة. نعم، بالطبع، يمكن عمل الرسوم المتحركة باستخدام png — على سبيل المثال، الرسوم المتحركة المتحركة، ولكن مثل هذه الرسوم المتحركة ستشغل مساحة أكبر بعشرات المرات، مع الأخذ في الاعتبار دعم جميع درجات الدقة.
ناقل لالروبوت؟
قبل أن تبدأ في إنشاء أصول متجهة، عليك أن تفهم ما هو المتجه على نظام Android. يعد فهم البنية أمرًا مهمًا للغاية لأنه لا توجد أدوات حاليًا لذلك خلق مناسبوالتحكم البصري في الرسوم المتحركة.
لسوء الحظ (أو لحسن الحظ)، لا يمكنك استخدام ملفات svg مباشرة في Android على الأقل، دون استخدام مكتبات الطرف الثالث. السبب بسيط للغاية وهو أن تنسيق SVG معقد جدًا وغني بالإمكانات ودعم مثل هذه الوظائف الغنية معقد وغير عملي لأشياء بسيطة مثل الرموز، ولا تنس مشكلة الأداء والتوافق. هذا هو السبب في أنهم يستخدمون تنسيقًا أبسط في Android، والذي، مع ذلك، يشبه في كثير من النواحي تنسيق svg.
يتم تمثيل الرسومات المتجهة في فئتين، VectorDrawable وAnimatedVectorDrawable. يتضح من اسم الفئات أن الأول مسؤول عن ناقل ثابت والثاني مسؤول عن الرسوم المتحركة. يتم وصف الفئات بواسطة مورد XML عادي.
أولاً، دعونا نلقي نظرة على VectorDrawable، الذي يحتوي على البنية التالية:
في العنصر
من أجل إضافة الرسوم المتحركة، نستخدم فئة ObjectAnimator، والتي نطبقها ببساطة على كائنات VectorDrawable. يمكننا تطبيق الرسوم المتحركة على مجموعة عامة وعلى مجموعة محددة
في السابق، لتنفيذ الرسوم المتحركة في أحد التطبيقات، كان من الضروري استخدام 3 ملفات xml على الأقل: ملف واحد لـ VectorDrawable الذي يحتاج إلى الرسوم المتحركة، وآخر لرسام الرسوم المتحركة الذي يصف الرسوم المتحركة، والملف الأخير الذي يجمع بين الرسوم المتحركة و VectorDrawable مباشرة . كلما كانت الرسوم المتحركة أكثر تعقيدًا، زادت الحاجة إلى إنشاء ملفات أكثر، مما أدى غالبًا إلى الارتباك.
في Google I/O 2016، تم تقديم تنسيق جديد - حزمة XML. يسمح لك بوصف الرسوم المتحركة المتجهة في ملف واحد.
مثال على حزمة XML
في الأساس، نحن جميعا معلومات ضروريةوضعت في AnimatedVectorDrawable. من السهل جدًا تجميع مثل هذا الملف، حيث يتم تمييز الأجزاء في الصورة، والتي يتم قطعها ببساطة من الموارد المقابلة وإدراجها بين علامات aapt الخاصة.
تحضير ناقل للأندرويد
لتبدأ، نحن بحاجة إلى أي محرر الرسومات، والذي يمكنه إخراج ملف SVG. ولحسن الحظ، هناك عدد كبير منها: Photoshop، وIllustrator، وSketch، وInkscape، وAffinity Designer، وما إلى ذلك.
عند إنشاء صورة متجهة، تحتاج إلى استخدام الأدوات الأساسية، لأن الظلال والمرشحات الأخرى لن تعمل ببساطة.
على سبيل المثال فعلت أيقونة بسيطةالقلعة وقسمتها إلى شكلين (مجموعات) للرسوم المتحركة اللاحقة. نحفظه بصيغة svg ونتأكد من التحقق من صحة التصدير. في كثير من الأحيان تنشأ مشاكل مع السكتة الدماغية والتداخل المفرط للكائنات. كقاعدة عامة، حاول دمج كل شيء في كائن واحد قدر الإمكان، وترجمة السكتة الدماغية إلى شكل(مخطط تفصيلي).
تحويل SVG إلى XML
هناك عدة طرق لتحويل ملف svg إلى xml.
الطريقة الأولى هي أن تفعل كل شيء باليد. هذا، بالطبع، ليس مريحا للغاية، ولكن لا يوجد شيء معقد هنا. ما عليك سوى نقل القطع من svg إلى xml باستخدام الأسماء الصحيحةحدود. لقد قمت أدناه بتسليط الضوء على القطع المتطابقة تمامًا تقريبًا.
ثانية الطريق — في الروبوتيحتوي الاستوديو على أداة Vector Asset Studio التي تتيح لك إجراء الترجمة تلقائيًا ملف SVGوفي XML. يمكنك تحديد الموارد من مكتبة الأيقونات أو تحديد ملف SVG الخاص بك. بفضل المعاينة، يمكنك تقييم صحة التصدير على الفور. يأكل إعدادات مفيدة.
الطريقة الثالثة — هي استخدام الأدوات عبر الإنترنت، على سبيل المثال