إنشاء صف لطريقة العرض

تجربة طريقة Compose
‫Jetpack Compose هي مجموعة أدوات واجهة المستخدم المقترَحة لنظام Android. كيفية استخدام التنسيقات في Compose

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

  • التوافق مع معايير Android
  • توفير سمات مخصّصة قابلة للتصميم تعمل مع تنسيقات Android XML
  • إرسال أحداث تسهيل الاستخدام
  • التوافق مع منصات Android متعددة

يوفّر إطار عمل Android مجموعة من الفئات الأساسية وعلامات XML لمساعدتك في إنشاء طريقة عرض تستوفي جميع هذه المتطلبات. ويتناول هذا الدرس كيفية استخدام إطار عمل Android لإنشاء الوظائف الأساسية لفئة طريقة العرض.

يمكنك العثور على معلومات إضافية في مقالة مكوّنات طريقة العرض المخصّصة.

إنشاء فئة فرعية من طريقة عرض

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

للسماح لـ "استوديو Android" بالتفاعل مع طريقة العرض، يجب توفير المنشئ الذي يأخذ كائن Context وكائن AttributeSet كمعلَمات على الأقل. تسمح دالة الإنشاء هذه لمحرّر التنسيق بإنشاء وتعديل نموذج من طريقة العرض.

Kotlin

class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)

Java

class PieChart extends View {
    public PieChart(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

تحديد سمات مخصّصة

لإضافة View مضمّنة إلى واجهة المستخدم، حدِّدها في عنصر XML وتحكَّم في مظهرها وسلوكها باستخدام سمات العنصر. يمكنك أيضًا إضافة طرق عرض مخصّصة وتنسيقها باستخدام XML. لتفعيل هذا السلوك في طريقة العرض المخصّصة، اتّبِع الخطوات التالية:

  • حدِّد سمات مخصّصة لطريقة العرض في عنصر مصدر <declare-styleable> .
  • حدِّد قيمًا للسمات في تنسيق XML.
  • استرجِع قيم السمات في وقت التشغيل.
  • طبِّق قيم السمات المسترجَعة على طريقة العرض.

يتناول هذا القسم كيفية تحديد السمات المخصّصة وتحديد قيمها. ويتناول القسم التالي كيفية استرجار القيم وتطبيقها في وقت التشغيل.

لتحديد سمات مخصّصة، أضِف <declare-styleable> إلى مشروعك. من المعتاد وضع هذه المصادر في ملف res/values/attrs.xml في ما يلي مثال على ملف attrs.xml:

<resources>
   <declare-styleable name="PieChart">
       <attr name="showText" format="boolean" />
       <attr name="labelPosition" format="enum">
           <enum name="left" value="0"/>
           <enum name="right" value="1"/>
       </attr>
   </declare-styleable>
</resources>

يعلن هذا الرمز عن سمتَين مخصّصتَين، هما showText وlabelPosition، تنتميان إلى كيان قابل للتصميم باسم PieChart. يكون اسم الكيان القابل للتصميم، حسب الاصطلاح، هو الاسم نفسه لاسم الفئة التي تحدّد طريقة العرض المخصّصة. على الرغم من أنّه ليس من الضروري اتّباع هذا الاصطلاح، يعتمد العديد من محرّري الرموز الشائعة على اصطلاح التسمية هذا لتوفير ميزة إكمال العبارات.

بعد تحديد السمات المخصّصة، يمكنك استخدامها في ملفات XML للتنسيق تمامًا مثل السمات المضمّنة الفرق الوحيد هو أنّ سماتك المخصّصة تنتمي إلى مساحة اسم مختلفة. بدلاً من الانتماء إلى مساحة الاسم http://schemas.android.com/apk/res/android، تنتمي إلى http://schemas.android.com/apk/res/[your package name]. على سبيل المثال، إليك كيفية استخدام السمات المحدّدة لـ PieChart:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:custom="http://schemas.android.com/apk/res-auto">
 <com.example.customviews.charting.PieChart
     custom:showText="true"
     custom:labelPosition="left" />
</LinearLayout>

لتجنُّب تكرار معرّف URI الطويل لمساحة الاسم، يستخدم المثال توجيه xmlns. يُعيّن هذا التوجيه الاسم المستعار custom لـ مساحة الاسم http://schemas.android.com/apk/res/com.example.customviews. يمكنك اختيار أي اسم مستعار تريده لمساحة الاسم.

لاحظ اسم علامة XML التي تضيف طريقة العرض المخصّصة إلى التنسيق. وهو الاسم المؤهّل بالكامل لفئة طريقة العرض المخصّصة. إذا كانت فئة طريقة العرض فئة داخلية، يمكنك تأهيلها بشكل أكبر باستخدام اسم الفئة الخارجية لطريقة العرض. على سبيل المثال، تحتوي فئة PieChart على فئة داخلية باسم PieView. لاستخدام السمات المخصّصة من هذه الفئة، استخدِم العلامة com.example.customviews.charting.PieChart$PieView.

تطبيق السمات المخصّصة

عند إنشاء طريقة عرض من تنسيق XML، تتم قراءة جميع السمات في علامة XML من حزمة الموارد وتمريرها إلى دالة إنشاء طريقة العرض كـ AttributeSet. على الرغم من أنّه من الممكن قراءة القيم من AttributeSet مباشرةً، فإنّ ذلك يتضمّن بعض العيوب:

  • لا تتم مطابقة مراجع الموارد ضمن قيم السمات.
  • لا يتم تطبيق الأنماط.

بدلاً من ذلك، مرِّر الـ AttributeSet إلى obtainStyledAttributes(). تعرض هذه الطريقة مصفوفة TypedArray من القيم التي تم إلغاء الإشارة إليها وتنسيقها.

يبذل برنامج تجميع موارد Android الكثير من الجهد لتسهيل استدعاء obtainStyledAttributes(). لكل مصدر <declare-styleable> في دليل res/، يحدّد R.java الذي تم إنشاؤه كلاً من مصفوفة معرّفات السمات ومجموعة من الثوابت التي تحدّد الفهرس لكل سمة في المصفوفة. يمكنك استخدام الثوابت المحدّدة مسبقًا لقراءة السمات من TypedArray. إليك كيفية قراءة فئة PieChart لسماتها:

Kotlin

init {
    context.theme.obtainStyledAttributes(
            attrs,
            R.styleable.PieChart,
            0, 0).apply {

        try {
            mShowText = getBoolean(R.styleable.PieChart_showText, false)
            textPos = getInteger(R.styleable.PieChart_labelPosition, 0)
        } finally {
            recycle()
        }
    }
}

Java

public PieChart(Context context, AttributeSet attrs) {
   super(context, attrs);
   TypedArray a = context.getTheme().obtainStyledAttributes(
        attrs,
        R.styleable.PieChart,
        0, 0);

   try {
       mShowText = a.getBoolean(R.styleable.PieChart_showText, false);
       textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);
   } finally {
       a.recycle();
   }
}

يُرجى العِلم أنّ كائنات TypedArray هي مورد مشترك ويجب إعادة تدويرها بعد الاستخدام.

إضافة الخصائص والأحداث

السمات هي طريقة فعّالة للتحكّم في سلوك وطرق عرض المظهر، ولكن لا يمكن قراءتها إلا عند تهيئة طريقة العرض. لتوفير سلوك ديناميكي، يمكنك عرض زوج من دوال إرجاع القيمة وتحديد القيمة للخصائص لكل سمة مخصّصة. يوضّح المقتطف التالي كيف تعرض PieChart خاصية باسم showText:

Kotlin

fun isShowText(): Boolean {
    return mShowText
}

fun setShowText(showText: Boolean) {
    mShowText = showText
    invalidate()
    requestLayout()
}

Java

public boolean isShowText() {
   return mShowText;
}

public void setShowText(boolean showText) {
   mShowText = showText;
   invalidate();
   requestLayout();
}

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

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

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

مراعاة تسهيل الاستخدام عند تصميم الموقع الإلكتروني

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

  • ضع تصنيفات لحقول الإدخال باستخدام السمة android:contentDescription.
  • أرسِل أحداث تسهيل الاستخدام من خلال استدعاء sendAccessibilityEvent() عند الاقتضاء.
  • توافَق مع وحدات التحكّم البديلة، مثل لوحة الأسهم أو كرة التتبّع.

لمزيد من المعلومات حول إنشاء طرق عرض تسهّل الاستخدام، يمكنك الاطّلاع على مقالة تسهيل استخدام التطبيقات.