یک نمای سفارشی خوب طراحی شده مانند هر کلاس دیگری است که به خوبی طراحی شده است. این مجموعه ای از عملکردها را با یک رابط ساده محصور می کند، از CPU و حافظه به طور موثر استفاده می کند و غیره. یک نمای سفارشی علاوه بر اینکه یک کلاس خوب طراحی شده است، باید موارد زیر را انجام دهد:
- مطابق با استانداردهای اندروید
- ویژگیهای سفارشی قابل استایل ارائه کنید که با طرحبندیهای Android XML کار میکنند.
- رویدادهای دسترسی را ارسال کنید.
- با چندین پلتفرم اندروید سازگار باشد.
فریم ورک اندروید مجموعه ای از کلاس های پایه و تگ های XML را ارائه می دهد تا به شما کمک کند نمایی ایجاد کنید که تمام این الزامات را برآورده کند. این درس نحوه استفاده از فریم ورک اندروید برای ایجاد عملکرد اصلی یک کلاس view را مورد بحث قرار می دهد.
می توانید اطلاعات بیشتری را در مؤلفه های نمای سفارشی بیابید.
زیر کلاس یک نما
تمام کلاس های view تعریف شده در فریم ورک اندروید، View
گسترش می دهند. نمای سفارشی شما همچنین میتواند View
مستقیماً گسترش دهد، یا میتوانید با گسترش یکی از زیرکلاسهای نمای موجود، مانند Button
، در زمان صرفهجویی کنید.
برای اینکه به Android Studio اجازه دهید با نمای شما تعامل داشته باشد، حداقل باید سازنده ای ارائه کنید که یک Context
و یک شی AttributeSet
را به عنوان پارامتر در نظر بگیرد. این سازنده به ویرایشگر layout اجازه می دهد تا نمونه ای از نمای شما را ایجاد و ویرایش کند.
کاتلین
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 توجه کنید که نمای سفارشی را به طرح اضافه می کند. این نام کاملاً واجد شرایط کلاس نمایش سفارشی است. اگر کلاس view شما یک کلاس داخلی است، آن را با نام کلاس بیرونی view مشخص کنید. به عنوان مثال، کلاس PieChart
یک کلاس داخلی به نام PieView
دارد. برای استفاده از ویژگی های سفارشی از این کلاس، از تگ com.example.customviews.charting.PieChart$PieView
استفاده می کنید.
اعمال ویژگی های سفارشی
هنگامی که یک نما از یک طرح XML ایجاد می شود، تمام ویژگی های تگ XML از بسته منبع خوانده می شود و به عنوان یک AttributeSet
به سازنده view ارسال می شود. اگرچه امکان خواندن مستقیم مقادیر از AttributeSet
وجود دارد، انجام این کار دارای معایبی است:
- ارجاعات منابع در مقادیر مشخصه حل نمی شوند.
- سبک ها اعمال نمی شوند.
درعوض، AttributeSet
به obtainStyledAttributes()
ارسال کنید. این متد یک آرایه از مقادیر TypedArray
را که قبلاً ارجاع داده شده و استایل داده شده است، پس می دهد.
کامپایلر منبع اندروید کارهای زیادی را برای شما انجام می دهد تا فراخوانی 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()
رویدادهای دسترسی را ارسال کنید. - از کنترلرهای جایگزین مانند D-pad یا trackball پشتیبانی کنید.
برای اطلاعات بیشتر درباره ایجاد نماهای قابل دسترس، به دسترسی بیشتر برنامه ها مراجعه کنید.