مشخصات مقاله
-
1804
-
0.0
-
4228
-
0
-
0
استفاده از Resource Selector در اندروید – انتخاب منابع متناسب با هر دستگاه به وسیله ی گزینشگر منابع (resource qualifer)
تنظیمات و پیکربندی های مختلف دستگاه های اندروید
طراحی برنامه برای انواع دستگاه های اندروید (با نمایشگر و اندازه های مختلف)
دستگاه های اندرویدی از نظر اندازه، تراکم پیکسلی نمایشگر و تنظیمات زبان مورد استفاده متفاوت هستند. برای سازگاری برنامه با دستگاه های مختلف، اندروید منابع مناسب با دستگاه میزبان را انتخاب نموده و اندازه بندی کامپوننت های رابط کاربری (UI) را خود بر حسب واحد dip (فرمت اندازه بندی نسبی) و به صورت اتوماتیک انجام می دهد.
Resource qualifier (تعریف کننده و گزینشگر منابع)
توسعه دهنده با بهره گیری از resource qualifier قادر خواهد برنامه را طوری طراحی کند که با دستگاه های مختلف سازگار باشد و در واقع برای هر دستگاه منابع مناسب (وضعیت نمایش، کیفیت تصویر و زبان مرتبط) را انتخاب نماید. برای ارائه ی فایل های منبع متناسب با تنظیمات هر دستگاه که توسط گزینشگر qualifier معرفی شده و قابل دستیابی می باشد، لازم است یک subfolder در پوشه ی res با ترکیب این qualifier و اسم فایل ایجاد نمایید. به عنوان مثال اسم فایل layout را layout-qualifier انتخاب کنید.
سیستم اندروید تنظیمات و پیکربندی دستگاه جاری را ارزیابی نموده، سپس بر اساس نتیجه ی ارزیابی فایل مناسب را به صورت خودکار انتخاب می کند.
Resource qualifier های مهم
استفاده از وضعیت نمایش/orientation به عنوان یک resource qualifier (گزینش منابع بر اساس وضعیت نمایش)
فرض کنید که می خواهید برای activity خود در نمای افقی (landscape mode) از یک فایل layout به نام activity_main.xml استفاده نمایید. در چنین شرایطی، ابتدا پوشه res/layout-land را ایجاد نموده، سپس فایل جدید را با همین نام (activity_main.xml) داخل این پوشه جایگذاری نمایید.
Version qualifier (گزینش منابع بر اساس ورژن اندروید)
برای انتخاب منابع مناسب با دستگاه جاری، توسعه دهنده می تواند از ورژن کتابخانه های اندروید (API level) بهره بگیرد که مبتنی بر qualifier یا تعریف کننده ی -v[minimum API level] می باشد. از این طریق شما می توانید بر اساس ویرایش اندروید theme و style متفاوت ارائه نمایید.
به عنوان نمونه برنامه نویس می تواند با تکیه بر این qualifier که منابع را بر اساس ویرایش اندروید گزینش می کند، style مربوطه را برای برنامه ارائه نماید و تجربه ی کاربری بهینه را به ارمغان بیاورد.
Width&Height به عنوان گزینشگر منبع
یکی دیگر از آیتم هایی که توسعه دهندگان برای گزینش منابع مناسب با هر دستگاه مورد استفاده قرار می دهند، smallest available widthو available widthمی باشد. smallest available width عبارت است از حداقل طول قابل استفاده ی صفحه برای نمایش کامپوننت های UI و available width عبارت است از پهنای واقعی بر اساس وضعیت نمایش دستگاه (نمای افقی/عمودی).
می توان با استفاده از گزینشگر width، برای مثال، بر اساس پهنای موجود نمایشگر دستگاه، فایل layout مناسب را انتخاب نمود. این نوع انتخاب منبع مبتنی بر qualifier (گزینشگر یا تعریف کننده ) -sw[Number]dp یا -w[Number]dp می باشد. [Number] مخفف تعداد پیکسل ها مستقل از دستگاه (dip) می باشد. به عنوان مثال، نمایشگر یک تبلت 7 اینچی معمولا 600dp می باشد و شما می توانید از طریق گزینشگر res/layout-sw600dp/ فایل layout سازگار با نمایشگر دستگاه میزبان را انتخاب نمایید.
سایر qualifier ها جهت گزینش منابع
سایر resource qualifier ها برای گزینش منابع را در آدرس زیر پیدا خواهید کرد.
http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources
String ها و محتوای متنی (ترجمه ی نوشته های برنامه)
می توانید با استفاده از resource selector ها، پوشه ی values را که می تواند حامل مقادیر رشته ای باشند، انتخاب نمایید. برای این منظور می توانید از پوشه ی values-qualifier استفاده کنید.
به عنوان مثال، جهت ارائه ی محتوای متنی به زبان انگلیسی یا آلمانی، می بایست از پوشه ی values-en و values-de استفاده نمایید.
Plural ها
اندروید از فایل های محتوایی به نام Plurals پشتیبانی می کند. Plural ها منابعی در قالب XML هستند که به شما این امکان را می دهد تا محتوای متنی مورد نیاز را بر اساس کمیت (مقدار خصیصه ی quantity) انتخاب نمایید. برای استفاده از فایل مقادیر مختلف همچون “zero”، “one”، “two”، “many”، “few”و “other” را داخل XML به quantity انتساب می دهید، سپس در کد با استفاده از متد getQuantityString() مقدار صحیح را از XML واکشی می کنید. می توانید رشته ها را فرمت دهی کنید. اما در صورت فرمت دهی String ها، برای بازیابی مقدار صحیح، لازم است فایل plural و number را به عنوان پارامتر به متد نام برده ارسال کنید. چنانچه از Object ها برای فرمت دهی استفاده می کنید، در آن صورت کافی است آن ها را به عنوان پارامتر اضافی به متد getQuantityString() ارسال نمایید.
- no Tutorial
- one Tutorial
- %d Tutorials
تکه کد زیر یک فایل plural تعریف می کند. این فایل بایستی در پوشه ی “res/values” جایگذاری شده و در این مثال نام آن را “plurals”می باشد.
// number is defined somewhere before this
// number =....
// get the Resources
Resources res = getResources();
// get the
String quantityString = res.getQuantityString(R.plurals.tutorials,
number, number);
// do something with it...
لازم به ذکر است که انتخاب بر اساس ضرورت نحوی و گرامری صورت گرفته است. رشته ی zero در انگلیسی کاملا نادیده گرفته می شود حتی اگر quantity برابر 0 باشد چرا که 0 به استثنای عدد 1 هیچ تفاوتی از نظر گرامری با 2 یا سایر اعداد ندارد (“no tutorial”، “one tutorial”، “two tutorials” و غیره ...)
استفاده از google translate
می توانید String (محتوای متنی) خود را به صورت دستی ترجمه کنید یا از ترجمه ی ماشینی استفاده نمایید.
اگرچه ترجمه ی ماشینی چندان مناسب نیست اما برخی مواقع می تواند تنها گزینه پیشرو باشد به خصوص اگر بودجه ی اپلیکیشن مورد نظر محدود باشد. نرم افزار Google Translate به صورت رایگان ترجمه را برای شما انجام می دهد که طبیعتا به خاطر ماشینی بودن آن از کیفیت پایین برخوردار است، اما در صورت تمایل می توانید در ازای پرداخت مبلغی، ترجمه ی ماشینی را توسط کارشناس ویرایش شده تحویل بگیرید.
نرم افزار نام برده در ابتدا پیشنهاد ترجمه ی با کیفیت و پولی را به شما می دهد. پس از رد کردن این پیشنهاد می توانید از سرویس ترجمه ی ماشینی بهره بگیرید.
مدیریت مبحث کیفیت تصویر و تراکم پیکسلی نمایشگر های مختلف
نمایشگر دستگاه های اندرویدی از نظر کیفیت تصویر (resolution) و تراکم پیکسلی متفاوت هستند.
یک کامپوننت UI با اندازه ی یکسان می تواند از تراکم پیکسلی متفاوتی برخوردار بوده و به عبارت دیگر تعداد پیکسل های تشکیل دهنده ی آن بیشتر باشد که نتیجتا کیفیت بهتر را به دنبال دارد.
به عنوان مثال، اگر تعداد پیکسل های یک کامپوننت رابط کاربری را خود به طور مستقیم تعیین نمایید، ظاهر آن در دستگاهی با تراکم پیکسلی پایین به صورت زیر خواهد بود.
حال چنانچه تصویر فوق را با همین تعداد پیکسل در دستگاهی با تراکم پیکسلی بالاتر مشاهده کنید، خواهید دید که ظاهر و رابط کاربری اپلیکیشن ناخوانا و غیر قابل استفاده خواهد بود.
به همین علت، شما بایستی منابع و محتوای گرافیکی لازم و مناسب (همچون آیکون اجرای برنامه/launcher و action bar) را در وضوح مختلف ارائه نمایید. این کار را می توانید با استفاده از pixel density به عنوان گزینش گر منابع مورد نیاز به انجام برسانید.
استفاده از density به عنوان گزینش گر منابع (انتخاب محتوا بر اساس چگالی پیکسلی)
می توانید pixel density را مبنای گزینش منابع مورد نیاز اپلیکیشن خود قرار دهید. اندروید برای این منظور گزینه های زیر را در اختیار توسعه دهنده قرار می دهد. حداقل (baseline) 160dpiاست. چنانچه دستگاه اندروید مورد نظر 320dpi داشته باشد، در آن صورت Drawable از drawable-hdpi انتخاب می شود.
ارائه ی آیکون در اندازه های مختلف
شما بایستی launcher یا آیکون اجرا، آیکون مربوط به action bar و آیکونی که در نوار اعلانات (notification bar) به نمایش در می آید را در پنج اندازه ی مهم زیر ارائه نمایید.
لازم به ذکر است که آیکون اجرای اپلیکیشن (launcher) را بایستی برای ارائه در Google Play در اندازه ی 512x512 px نیز در نظر بگیرید.
تعیین اندازه ی کامپوننت های UI در فایل های layout
اندازه بندی در ابعاد ثابت (fixed) یا نسبی (relative)
اندروید به شما این امکان را می دهد تا اندازه ی کامپوننت های رابط کاربری را در ابعاد ثابت یا نسبی داخل فایل های layout مشخص نمایید. در صورت تعیین اندازه ی المان های رابط کاربری در اندازه ی ثابت، برای مثال پیکسل، ظاهر اپلیکیشن شما ممکن است در یک دستگاه مناسب باشد اما در دستگاهی که دارای تراکم پیکسلی بالاتر است، دکمه به نسبت نمایشگر میزبان بسیار کوچک و بی تناسب جلوه کند.
در ساخت اپلیکیشن های اندرویدی توصیه می شود همیشه ابعاد کامپوننت های UI خود را به صورت نسبی (relative) مشخص نمایید.
استفاده از واحد dp برای اندازه بندی و تعیین ابعاد المان های UI به صورت نسبی
واحد اندازه بندی که بایستی در تعیین ابعاد المان های رابط کاربری مورد استفاده قرار دهید، dp می باشد.
dp حالت اختصار dip یا device independent pixel به معنی تعیین تعداد پیکسل مستقل از چگالی دستگاه میزبان می باشد.
منظور از dp یک پیکسل در دستگاه اندروید با چگالی 160dpi می باشد. تراکم پیکسلی مزبور در واقع به چگالی اولین دستگاه تولیده شده ی اندروید (G1) اشاره دارد که از آن تحت عنوان mdpi (medium dots per inch) نیز یاد می شود.
اگر اندازه ی دستگاه را بر حسب dp مشخص نمایید، در آن صورت سیستم اندروید المان های رابط کاربری شما را به صورت خودکار متناسب با دستگاه میزبان بزرگ/کوچک و مقیاس دهی می کند.
در یک دستگاه mdpi (دستگاهی با چگالی یا تراکم پیکسلی متوسط)، 1dp معادل یک پیکسل است. این در حالی است که 1dp در دستگاهی با ldpi (چگالی پایین) کوچکتر (حدودا 120dpi)، در دستگاهی با چگالی بالا (high density) بزرگتر (حدودا 240dpi) می باشد. از این رو یک dp حدودا همان میزان فضا را در تمامی دستگاه ها اشغال می کند.
می توانید اندازه و ابعاد المان های رابط کاربری خود را در فایل های layout بر حسب dp تعیین نمایید.
اندازه بندی نوشته ها بر حسب واحد sp
چنانچه قرار است واحد اندازه بندی با تنظیمات انتخابی کاربر در خصوص نوشته ها مقیاس دهی و تنظیم شود، لازم است از واحد اندازه گیری sp استفاده نمایید. این واحد اندازه گیری شبیه به dp عمل می کند، با این تفاوت که بر اساس تنظیمات دلخواه کاربر نیز قابل مقیاس بندی شده و با آن هماهنگ می باشد (به عبارت دیگر با تنظیمات اندازه ی فونتی که کاربر تعیین می کند منطبق می باشد. از این رو خروجی با چگالی نمایشگر میزبان و انتخاب کاربر همگام خواهد بود).
چنانچه کاربر تصمیم بگیرد که اندازه ی فونت را در تنظیمات افزایش دهد، به دنبال آن تمامی view هایی که بر حسب sp تنظیم شده اند، به همان ترتیب مقیاس دهی می شوند.
تعیین اندازه ی کامپوننت های UI در کد برنامه (source code)
API و مجموعه توابع اندروید اغلب از توسعه دهنده درخواست می کند که اندازه ی المان ها را بر حسب پیکسل مشخص کند و واحد dp را به عنوان ورودی از شما نمی پذیرد. در چنین شرایطی لازم است واحد dp را به پیکسل تبدیل نمایید.
برای نیل به این هدف می توانید از متد زیر استفاده نمایید. این متد ابعاد المان را بر حسب dp به عنوان ورودی دریافت می کند سپس آن را داخل بدنه ی خود به پیکسل تبدیل نموده و در خروجی برمی گرداند.
public int convertToPixelFromDp(int dpInput) {
// get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// convert the dps to pixels, based on density scale
return (int) (dpInput * scale + 0.5f);
}
جهت بدست آوردن چگالی پیکسلی دستگاه جاری می توانید متد زیر را مورد استفاده قرار دهید.
getResources().getConfiguration().densityDpi;