MDC-104 Android: المكونات المتقدمة للمواد (Java)

1. مقدمة

logo_components_color_2x_web_96dp.png

تساعد المكونات المادية (MDC) المطورين على تنفيذ التصميم المتعدد الأبعاد. يضم مركز MDC، الذي أنشأه فريق من المهندسين ومصممي تجربة المستخدم في Google، عشرات من مكونات واجهة المستخدم الجميلة والعملية، وهو متاح لأجهزة Android وiOS والويب وFlutter.material.io/develop

في الدرس التطبيقي MDC-103 حول الترميز، خصّصت لون مكونات المواد (MDC) وارتفاعها وأسلوب الخط لتصميم تطبيقك.

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

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

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

ما الذي ستنشئه

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

  • شكل
  • الحركة
  • فئات حزمة تطوير البرامج (SDK) التقليدية لنظام التشغيل Android

21c025467527a18e.png dcde66003cd51a5.png

مكونات MDC-Android في هذا الدرس التطبيقي حول الترميز

  • شكل

المتطلبات

  • معرفة أساسية بتطوير تطبيقات Android
  • استوديو Android (يمكنك تنزيله من هنا إذا لم يكن متوفّرًا لديك)
  • محاكي أو جهاز Android (متاح من خلال "استوديو Android")
  • نموذج الرمز (انظر الخطوة التالية)

ما هو تقييمك لمستوى خبرتك في إنشاء تطبيقات Android؟

حديث متوسط بارع

2. إعداد بيئة التطوير

هل تريد المتابعة من MDC-103؟

إذا أكملت MDC-103، يجب أن يكون الرمز الخاص بك جاهزًا لهذا الدرس التطبيقي حول الترميز. انتقِل إلى الخطوة 3.

هل تريد البدء من نقطة الصفر؟

تنزيل تطبيق "الدرس التطبيقي حول الترميز" للمبتدئين

يتوفّر تطبيق إجراء التفعيل في دليل material-components-android-codelabs-104-starter/java. تأكَّد من cd في ذلك الدليل قبل البدء.

...أو استنساخها من GitHub

لاستنساخ هذا الدرس التطبيقي حول الترميز من GitHub، شغِّل الأوامر التالية:

git clone https://github.com/material-components/material-components-android-codelabs
cd material-components-android-codelabs/
git checkout 104-starter

تحميل رمز إجراء التفعيل في "استوديو Android"

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

F5H6srsw_5xOPGFpKrm1RwgewatxA_HUbDI1PWoQUAoJcT6DpfBOkAYwq3S-2vUHvweUaFgAmG7BtUKkGouUbhTwXQh53qec8tO5eVecdlo7QIoLc8rNxFEBb8l7RlS-KzBbZOzVhA

إضافة تبعيات المشروع

يجب أن يعتمد المشروع على مكتبة دعم MDC Android. يُفترض أن يحتوي نموذج التعليمات البرمجية الذي نزّلته بالفعل على هذه التبعية، ولكن من الجيد القيام بالخطوات التالية للتأكد.

  1. انتقِل إلى ملف build.gradle في وحدة app وتأكَّد من أنّ الكتلة dependencies تتضمن اعتمادًا على MDC Android:
api 'com.google.android.material:material:1.1.0-alpha06'
  1. (اختياري) إذا لزم الأمر، عدِّل ملف build.gradle لإضافة الاعتماديات التالية ومزامنة المشروع.
dependencies {
    api 'com.google.android.material:material:1.1.0-alpha06'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.android.volley:volley:1.1.1'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:core:1.1.0'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test:runner:1.2.0-alpha05'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha05'
}

تشغيل تطبيق إجراء التفعيل

  1. تأكَّد من أنّ إعدادات الإصدار على يمين زر التشغيل / التشغيل هي app.
  2. اضغط على الزر الأخضر تشغيل / تشغيل لإنشاء التطبيق وتشغيله.
  3. في نافذة اختيار هدف النشر، إذا كان لديك جهاز Android مُدرَج في أجهزتك المتاحة، انتقِل إلى الخطوة 8. بخلاف ذلك، انقر على إنشاء جهاز افتراضي جديد.
  4. في شاشة اختيار الأجهزة، اختَر جهاز هاتف، مثل Pixel 2، ثم انقر على التالي.
  5. في شاشة صورة النظام، اختَر إصدارًا حديثًا من Android، ويُفضَّل أن يكون أعلى مستوى لواجهة برمجة التطبيقات. إذا لم يكن مثبتًا، انقر على رابط التنزيل الذي يظهر وأكمل عملية التنزيل.
  6. انقر على التالي.
  7. على شاشة جهاز Android الافتراضي (AVD)، اترُك الإعدادات كما هي وانقر على إنهاء.
  8. اختر جهاز Android من مربّع حوار هدف النشر.
  9. انقر على حسنًا.
  10. يعمل "استوديو Android" على إنشاء التطبيق ونشره وفتحه تلقائيًا على الجهاز الهدف.

اكتمال عملية النقل بنجاح من المفترض أن يظهر تطبيق Shrine على جهازك.

79eaeaff51de5719.png

3- إضافة قائمة الصور الخلفية

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

إخفاء محتوى الشبكة

في shr_product_grid_fragment.xml، أضِف السمة android:visibility="gone" إلى NestedScrollView لإزالة محتوى المنتج مؤقتًا:

shr_product_grid_fragment.xml

<androidx.core.widget.NestedScrollView
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_marginTop="56dp"
   android:background="@color/productGridBackgroundColor"
   android:elevation="8dp"
   android:visibility="gone"
   app:layout_behavior="@string/appbar_scrolling_view_behavior">

سنقوم بتثبيت صورة خلفية في هذه المنطقة. لتجنب ظهور قسم بين شريط التطبيق العلوي ومحتوى القائمة الذي يظهر في الصور الخلفية، سنجعل الخلفية بنفس لون شريط التطبيق العلوي.

في shr_product_grid_fragment.xml، أضِف ما يلي كعنصر أول في الجذر FrameLayout، قبل AppBarLayout:

shr_product_grid_fragment.xml

<LinearLayout
   style="@style/Widget.Shrine.Backdrop"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center_horizontal"
   android:orientation="vertical"
   android:paddingTop="100dp"
   android:paddingBottom="100dp">

</LinearLayout>

في "styles.xml"، أضِف ما يلي:

styles.xml

<style name="Widget.Shrine.Backdrop" parent="">
   <item name="android:background">?attr/colorAccent</item>
</style>

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

إضافة قائمة الطعام

القائمة هي في الأساس قائمة بأزرار نصية. سنضيف واحدًا هنا.

أنشِئ تنسيقًا جديدًا يُسمى shr_backdrop.xml في دليل res -> layout وأضِف ما يلي:

shr_backdrop.xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_featured_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_apartment_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_accessories_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_shoes_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_tops_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_bottoms_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_dresses_label" />

   <View
       android:layout_width="56dp"
       android:layout_height="1dp"
       android:layout_margin="16dp"
       android:background="?android:attr/textColorPrimary" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_account_label" />

</merge>

وأضِف هذه القائمة إلى LinearLayout التي أضفتها للتو في "shr_product_grid_fragment.xml" باستخدام علامة <include>:

shr_product_grid_fragment.xml

<LinearLayout
   style="@style/Widget.Shrine.Backdrop"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center_horizontal"
   android:orientation="vertical"
   android:paddingTop="88dp">

   <include layout="@layout/shr_backdrop" />
</LinearLayout>

البناء والتشغيل. يُفترض أن تظهر شاشتك الرئيسية على النحو التالي:

a87a58e2ccddbae5.png

اكتملت عملية إعداد الصور الخلفية. دعونا نعيد المحتوى الذي أخفيناه في وقت سابق.

4. إضافة شكل

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

إضافة طبقة جديدة

ينبغي أن نعرض طبقة شبكة المنتج مرة أخرى. أزِل السمة android:visibility="gone" من NestedScrollView:

shr_product_grid_fragment.xml

<androidx.core.widget.NestedScrollView
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_marginTop="56dp"
   android:background="@color/productGridBackgroundColor"
   android:elevation="8dp"
   app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

إضافة شكل

قم بتعديل شكل الشبكة. لقد وفّرنا خلفية بشكل مخصّص، ولكن لا يظهر الشكل بشكل صحيح إلا على Android Marshmallow والإصدارات الأحدث. يمكننا ضبط الخلفية shr_product_grid_background_shape على جهاز NestedScrollView لنظام Android Marshmallow فقط والإصدارات الأحدث. عليك أولاً إضافة id إلى NestedScrollView كي نتمكّن من الإشارة إليه في الرمز على النحو التالي:

shr_product_grid_fragment.xml

<androidx.core.widget.NestedScrollView
   android:id="@+id/product_grid"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_marginTop="56dp"
   android:background="@color/productGridBackgroundColor"
   android:elevation="8dp"
   app:layout_behavior="@string/appbar_scrolling_view_behavior">

بعد ذلك، يمكنك ضبط الخلفية آليًا في ProductGridFragment.java. أضِف المنطق التالي لضبط الخلفية على نهاية onCreateView()، قبل عبارة الإرجاع مباشرةً:

ProductGridFragment.java

// Set cut corner background for API 23+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    view.findViewById(R.id.product_grid).setBackgroundResource(R.drawable.shr_product_grid_background_shape);
}

أخيرًا، سنعدّل مورد الألوان productGridBackgroundColor (الذي يستخدمه أيضًا خلفية الشكل المخصّص) على النحو التالي:

colors.xml

<color name="productGridBackgroundColor">#FFFBFA</color>

الإنشاء والتشغيل:

9cf7a94091438011.png

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

5- إضافة حركة

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

إضافة حركة الكشف إلى زر القائمة

الحركة هي الشكل الذي يظهر أمامه يتحرك لأسفل مباشرةً. لقد سبق أن قدّمنا لك أداة معالجة نقرات ستنفّذ الصورة المتحركة لترجمة الورقة في NavigationIconClickListener.java. يمكننا ضبط مستمع النقر هذا في طريقة setupToolbar() من ProductGridFragment.java:

ProductGridFragment.java

toolbar.setNavigationOnClickListener(new NavigationIconClickListener(getContext(), view.findViewById(R.id.product_grid)));

من المفترض أن تظهر طريقة setUpToolbar() الآن على النحو التالي:

ProductGridFragment.java

private void setUpToolbar(View view) {
   Toolbar toolbar = view.findViewById(R.id.app_bar);
   AppCompatActivity activity = (AppCompatActivity) getActivity();
   if (activity != null) {
       activity.setSupportActionBar(toolbar);
   }

   toolbar.setNavigationOnClickListener(new NavigationIconClickListener(getContext(), view.findViewById(R.id.product_grid)));
}

البناء والتشغيل. اضغط على زر القائمة:

46a878bade66f821.png

سيؤدي الضغط على رمز قائمة التنقل مرة أخرى إلى إخفاء القائمة.

تعديل حركة الطبقة الأمامية

تُعتبر الحركة وسيلة رائعة للتعبير عن علامتك التجارية. لنرى كيف تبدو الرسوم المتحركة الخاصة بالإظهار باستخدام منحنى توقيت مختلف.

حدِّث الرمز الخاص بك في setupToolbar() في ProductGridFragment.java لتمرير أداة Inpolator إلى أداة معالجة النقرات لرمز التنقل الخاص بك، كما يلي:

ProductGridFragment.java

private void setUpToolbar(View view) {
   Toolbar toolbar = view.findViewById(R.id.app_bar);
   AppCompatActivity activity = (AppCompatActivity) getActivity();
   if (activity != null) {
       activity.setSupportActionBar(toolbar);
   }

   toolbar.setNavigationOnClickListener(new NavigationIconClickListener(
           getContext(),
           view.findViewById(R.id.product_grid),
           new AccelerateDecelerateInterpolator()));
}

ينتج عن ذلك تأثير مختلف، أليس كذلك؟

6- رمز علامة تجارية

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

تغيير رمز زر القائمة

قم بتغيير زر القائمة لعرض أيقونة تتضمن تصميمًا ماسيًا. حدِّث شريط الأدوات في shr_product_grid_fragment.xml لاستخدام الرمز الجديد الذي يحمل اسم العلامة التجارية (shr_branded_menu)، واضبط السمتين app:contentInsetStart وandroid:padding لجعل شريط الأدوات يتوافق بشكل أفضل مع مواصفات المصمم:

shr_product_grid_fragment.xml

<androidx.appcompat.widget.Toolbar
   android:id="@+id/app_bar"
   style="@style/Widget.Shrine.Toolbar"
   android:layout_width="match_parent"
   android:layout_height="?attr/actionBarSize"
   android:paddingStart="12dp"
   android:paddingLeft="12dp"
   android:paddingEnd="12dp"
   android:paddingRight="12dp"
   app:contentInsetStart="0dp"
   app:navigationIcon="@drawable/shr_branded_menu"
   app:title="@string/shr_app_name" />

يُرجى تعديل أداة معالجة النقرات مرة أخرى في setupToolbar() في ProductGridFragment.java لتضمين عناصر قابلة للرسم في شريط الأدوات عندما تكون القائمة مفتوحة وعند إغلاقها، على النحو التالي:

ProductGridFragment.java

private void setUpToolbar(View view) {
   Toolbar toolbar = view.findViewById(R.id.app_bar);
   AppCompatActivity activity = (AppCompatActivity) getActivity();
   if (activity != null) {
       activity.setSupportActionBar(toolbar);
   }

   toolbar.setNavigationOnClickListener(new NavigationIconClickListener(
           getContext(),
           view.findViewById(R.id.product_grid),
           new AccelerateDecelerateInterpolator(),
           getContext().getResources().getDrawable(R.drawable.shr_branded_menu), // Menu open icon
           getContext().getResources().getDrawable(R.drawable.shr_close_menu))); // Menu close icon
}

الإنشاء والتشغيل:

21c025467527a18e.png dcde66003cd51a5.png

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

7. ملخّص

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

الخطوات التالية

يُكمل هذا الدرس التطبيقي، MDC-104، سلسلة الدروس التطبيقية حول الترميز. يمكنك استكشاف المزيد من المكونات في MDC-Android من خلال الانتقال إلى Android Widgets Catalog.

إذا أردت الحصول على مزيد من التحديات في هذا الدرس التطبيقي حول الترميز، عليك تعديل تطبيق Shrine لتغيير صور المنتجات التي تظهر عند اختيار فئة من قائمة الصور الخلفية.

لمعرفة كيفية ربط هذا التطبيق بمنصة Firebase لتوفير خلفية تعمل بشكلٍ سليم، يمكنك الاطّلاع على الدرس التطبيقي حول ترميز Android في Firebase.

تمكنتُ من إكمال هذا الدرس التطبيقي حول الترميز بقدرٍ معقول من الوقت والجهد

أوافق بشدة أوافق ليست دقيقة ولا غير دقيقة لا أوافق لا أوافق أبدًا

أود مواصلة استخدام Material Components في المستقبل

أوافق بشدة أوافق ليست دقيقة ولا غير دقيقة لا أوافق لا أوافق أبدًا