یک نمای سفارشی با طراحی خوب مانند هر کلاس دیگری با طراحی خوب است. این برنامه مجموعه خاصی از عملکردها را با یک رابط ساده دربرمیگیرد، بهطور کارآمد از واحد پردازش مرکزی و حافظه استفاده میکند، و غیره. یک نمای سفارشی علاوهبر اینکه باید کلاسی با طراحی خوب باشد، باید کارهای زیر را نیز انجام دهد:
- با استانداردهای Android مطابقت داشته باشد.
- مشخصههای قابلسبکبندی سفارشی ارائه دهید که با چیدمانهای XML در Android کار میکنند.
- ارسال رویدادهای دسترسپذیری.
- با چندین پلاتفرم Android سازگار باشد.
چارچوب Android مجموعهای از کلاسهای پایه و برچسبهای XML را ارائه میدهد تا به شما کمک کند نمایی ایجاد کنید که همه این الزامات را برآورده کند. این درس درباره نحوه استفاده از چارچوب Android برای ایجاد عملکرد اصلی کلاس نمای بحث میکند.
اطلاعات بیشتر را میتوانید در مؤلفههای نمای سفارشی پیدا کنید.
زیرکلاس کردن نما
همه کلاسهای نمای تعریفشده در چارچوب Android،
View را گسترش میدهند. نمای سفارشی شما همچنین میتواند مستقیماً View را گسترش دهد، یا میتوانید با گسترش یکی از زیرکلاسهای نمای موجود، مانند Button، در زمان صرفهجویی کنید.
برای اینکه Android Studio بتواند با نمای شما تعامل داشته باشد، حداقل باید سازندهای ارائه دهید که
Context و شیء AttributeSet را بهعنوان پارامتر دریافت کند.
این سازنده به ویرایشگر چیدمان اجازه میدهد تا نمونهای از نمای شما را ایجاد و ویرایش کند.
کاتلین
class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)
جاوا
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 آورده شده است:
کاتلین
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() } } }
جاوا
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 را نمایش میدهد:
کاتلین
fun isShowText(): Boolean { return mShowText } fun setShowText(showText: Boolean) { mShowText = showText invalidate() requestLayout() }
جاوا
public boolean isShowText() { return mShowText; } public void setShowText(boolean showText) { mShowText = showText; invalidate(); requestLayout(); }
توجه کنید که setShowText با invalidate()
و requestLayout() تماس میگیرد. این فراخوانیها برای اطمینان از اینکه نما بهطور قابلاعتمادی رفتار میکند، بسیار مهم هستند. باید
نمای را پساز هر تغییری در ویژگیهای آن که ممکن است ظاهرش را تغییر دهد، باطل کنید تا
سیستم بداند که باید دوباره ترسیم شود. بههمین ترتیب، اگر ویژگیای بهگونهای تغییر کند که ممکن است بر اندازه یا شکل نما تأثیر بگذارد، باید چیدمان جدیدی درخواست کنید. فراموش کردن این فراخوانیهای روش میتواند باعث ایجاد
اشکالاتی شود که بهسختی
پیدا میشوند.
نماهای سفارشی باید از شنوندگان رویداد نیز برای برقراری ارتباط با رویدادهای مهم پشتیبانی کنند. برای
مثال، PieChart
رویداد سفارشیای بهنام OnCurrentItemChanged را نشان میدهد تا به شنوندگان اطلاع دهد که
کاربر نمودار دایرهای را چرخانده است تا
روی بخش جدیدی از نمودار دایرهای تمرکز کند.
بهراحتی ممکن است فراموش کنید که ویژگیها و رویدادها را آشکار کنید، بهویژه زمانی که تنها کاربر نمای سفارشی هستید. صرف زمان برای تعریف دقیق میانای نمای شما هزینههای نگهداری آینده را کاهش میدهد. قانون خوبی که باید دنبال کنید این است که همیشه هر ویژگیای را که بر ظاهر یا رفتار قابلمشاهده نمای سفارشی شما تأثیر میگذارد، آشکار کنید.
طراحی برای دسترسپذیری
نمای سفارشی شما باید از طیف گستردهای از کاربران پشتیبانی کند. این شامل کاربرانی میشود که ناتوانیهایی دارند که مانع از دیدن یا استفاده آنها از صفحه لمسی میشود. برای پشتیبانی از کاربران دارای ناتوانی، کارهای زیر را انجام دهید:
- فیلدهای ورودی را بااستفاده از مشخصه
android:contentDescriptionبرچسبگذاری کنید. - ارسال رویدادهای دسترسپذیری با تماس با
sendAccessibilityEvent()درصورت لزوم. - از کنترلکنندههای جایگزین، مانند پد کنترل یا گوی پیمایش، پشتیبانی کند.
برای اطلاعات بیشتر درباره ایجاد نماهای دسترسپذیر، دسترسپذیرتر کردن برنامهها را ببینید.