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

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

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

  • الامتثال لمعايير Android.
  • قدِّم سمات أنماط مخصّصة تتوافق مع تنسيقات XML لنظام التشغيل Android.
  • إرسال أحداث إمكانية الوصول.
  • أن تكون متوافقة مع أنظمة أساسية متعدّدة لنظام Android

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

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

تصنيف فرعي لطريقة العرض

ويتم توسيع نطاق View لجميع فئات طريقة العرض المحدّدة في إطار عمل Android. ويمكن أيضًا لطريقة العرض المخصّصة أن تُوسّع نطاق 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() عندما يكون ذلك مناسبًا.
  • دعم وحدات التحكم البديلة، مثل لوحة التحكّم أو كرة التعقب.

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