مترجم: حبیب الله علیخانی
منبع: راسخون
منبع: راسخون
اضافه کردن یک تصویر به اپلیکیشن
اکنون شما نیاز به قرار دادن یک سری چیز ها روی صفحه ی نمایش دارید. ادامه ی این آموزش سرگرم کننده است و اجرای واقعا جالب از طریق مکانیزم های ورودی و تصاویر اضافه شده است. در بخش زیر نشان دادیم که چگونه تصاویر را به اپلیکیشن خود اضافه کنید.معرفی Size و Density
صفحه دستگاه هایی که به سیستم عامل اندروید مجهز می باشند دارای دو خصوصیت کلی تحت عناوین Size به معنی "اندازه" و Density به معنی "تراکم" می باشند. به عبارت دیگر Density حاکی تعداد پیکسل هایی است که در یک اینچ از صفحه نمایش قرار می گیرند. در واقع هرچه تعداد پیکسل ها در هر اینچ بیشتر باشند بالتبع رزولوشن صفحه بیشتر بوده و دستگاه از کیفیت نمایش بیشتری برخوردار خواهد بود.در واقع یک اپلیکیشن موفق به اپلیکیشنی می توان گفت که روی دستگاه هایی با Size ها و Density های متفاوت نصب شده و کار کند. بنابراین ما به عنوان یک توسعه دهنده اندروید می بایست منابع متفاوتی را در اپلیکیشن خود استفاده کنیم تا بتوانیم اپلیکیشن خود را برای هر دستگاهی بهینه سازیم.
به طور کلی چهار Size کلی در رابطه با دستگاه های اندرویدی وجود دارد که عبارتند از:
: Small به معنی "کوچک"،
Normal به معنی "معمولی"،
Large به معنی "بزرگ" ،
Xlarge به معنی "خیلی بزرگ".
به عنوان مثال برای ذخیره سازی تصاویری برای دستگاه هایی با صفحه نمایشی با Density بسیار زیاد می توانیم فولدری تحت عنوان drawable-xhdpi در پروژه خود ایجاد کنیم. علاوه بر این به خاطر داشته باشیم که Screen Orientation به معنی "جهت قرارگیری صفحه" که می تواند Landscape یا"افقی" یا Portrait یا "عمودی" نیز می تواند به نوعی اندازه صفحه محسوب شوند. به عبارت دیگر می توانیم اپلیکیشن خود را طوری طراحی کنیم که شکل ظاهری اپلیکیشن ما در حالت های Landscape و Portrait بهینه باشد.
چرا در مورد Density پوشه ها نگرانید؟
اندروید از اندازه های صفحه نمایش و Density مختلف پشتیبانی می کند. پیش از آن، شما باید تصویر را در پوشه ی mdpi قرار دهید، که این تصویر برای دستگاه های با Density متوسط می باشد. در مورد دستگاه های با Density ی کوچک و بزرگ چطور است؟ اگر اندروید نتواند منابع درخواستی در Density ی مورد نظر پیدا کند، Density ای که میتواند پیدا کند را انتخاب می کند. این به چه معنی است؟ اگر شما در حال اجرای روی یک صفحه با Density ی بالا هستید، تصویر کشیده خواهد شد و به احتمال زیاد نامتعادل خواهد شد. و اگر بر روی دستگاه با چگالی کم باشید، تصویر فشرده خواهد شد تا به ابعاد صفحه نمایش متناسب شود. برای جلوگیری از این مورد، چندین نسخه از تصویر خود برای قرار دادن در هر Density ی صفحه نمایش ایجاد کنیم. برای کسب اطلاعات بیشتر، به بهترین راهنمای عملی پشتیبانی چند صفحه (Supporting Multiple Screens) در اسناد اندروید واقع در http://developer.android.com/guide/practices/screens_support.html. رجوع کنید. اما ما در اینجا به طور مختصر به آن پرداختیم.قرار دادن یک تصویر در صفحه نمایش
اولین چیزی که شما اضافه می کنید، تصویر تلفن است. افزودن تصویر به پروژه اسان است. ما به سادگی آنها را درگ می کنیم و سپس در پروژه ارجاع می دهیم.1- تصویر تلفن را به داخل پوشه ی res/drawable-mdpi در پروژه ی ایکلیپس درگ می کنیم. مانند تصویر زیر:
2- تصویر دیگری- برای حالت بی صدا یا هر چیز دیگری که دوست داشتید- را به داخل پوشه ی res/drawable-mdpi درگ کنید:
در ادامه ی این بخش نام تصاویر به شرح زیر است:
• تصویر حالت عادی: phone_on.png
• تصویر حالت بی صدا : phone_silent.png
اگر نام تصاویر شما بر این اساس نبود، می توانید نام آن را تغییر دهید. تا اینجا پروژه ی ایکلیپس شما به صورت زیر است:
اضافه کردن تصویر به layout
اکنون زمان آن است که تصویر را به layout اضافه کنید. برای انجام این کار، لازم است کد زیر را در فایل main.xml کپی کنید، در واقع روی محتویات فعلی آن بازنویسی کنید.تنضیمات خصوصیات تصویر
ImageView شامل یک جفت پارامترهای اضافی است که تا کنون ندیده اید. بنابراین اکنون آن را پوشش می دهیم: خصوصیت android:id=”@+id/phone_icon” :
صفت id یک شناسه ی منحصر بفرد را برای نمایش در سیستم اندروید تعریف می کند. برای توصیف بهتر از android:id استفاده کرده ام.
خصوصیت layout_gravity : این خصوصیت نحوه ی قرار گرفتن view را در هردو محور x و y ، با parent خود را تعیین می کند. در اینجا این مقدار ثابت center_horizontal است. این مقدار به سیستم اندروید اطلاع می دهد تا شی در مرکز افقی ظرف خود قرار گیرد و سایز آن تغییر نمی کند. شما می توانید از ثابت های دیگری استفاده کنید، مانند center_vertical, top, bottom, left, right و غیره .
خصوصیت android:src=”@drawable/phone_on” : این خصوصیت یک فرزند مستقیم از کلاس ImageView است. شما از این خصوصیت برای تنظیم تصویر که می خواهید روی صفحه نمایش نشان دهید، استفاده می کنید.
به مقدار خصوصیت src - “@drawable/phone_on” -توجه کنید. چیزی که شما اکنون می بینید از فایل R.java استفاده کرده است. شما می توانید از طریق XML به منابع drawable مراجعه کنید. این کار با تایپ علامت @ قبل ازمنبع انجام دهید.
تنظیمات منابع drawable
ما برای شناسه منبع drawable به صورت @drawable-mdpi تایپ نکردیم. ما فقط @drawable تایپ کردیم. این کار اندروید برای پشتیبانی از چندین سایز صفحه است. سیستم layout اندروید درباره ی drawable و همه چیز می داند. در زمان طراحی هیچ چیز از Density ی بالا، پایین، متوسط drawable نمی داند اما در زمان اجرا اندروید تعیین می کند که کجا و چه وقت می تواند از Density ی بالا، پایین، متوسط استفاده کند.برای مثال، اگر برنامه در یک دستگاه با چگالی بالا در حال اجرا باشد و درخواست منابع drawable در پوشه drawable-hdpi در دسترس باشد، اندروید از آن منبع استفاده می کند. در غیر اینصورت آن را با استفاده از نزدیکترین تطابق می تواند پیدا کند. حمایت از اندازه و Density مختلف صفحه نمایش های موضوع وسیعی (و در برخی از جنبه ها پیچیده) است.
بخش phone_on ، drawable را که می خواهید استفاده کنید را شناسایی می کند. نام فایل تصویر در واقع phone_on.png است که در اینجا پسوند آن برداشته شد. اگر شما فایل R.java را درپوشه ی gen باز کرده بودید، می توانستید یک عضو متغییر با نام phone_on را ببینید نه phone_on.png.
از ADT تشکر می کنیم، شما می توانید از طریق تکمیل کد گزینه های در دسترس برای این خصوصیت ببینید. در ادیتور ایکلیپس در قسمت کد ImageView ، اشاره گر خود را درست بعد از “@drawable/” که در خصوصیت src است، قرار دهید. سپس Ctrl+spacebar را فشار دهید. گزینه های دیگری در اینجا نمایش داده می شود(تصویر زیر) که می توانید برای بخش src مربوط به drawable انتخاب کنید.
معرفی dpi
به طور کلی بایستی گفت که یک توسعه دهندۀ اندروید نه تنها می بایست اندازه های متفاوت صفحه نمایش دستگاه های اندرویدی را در حین ساخت یک اپلیکیشن مد نظر قرار دهد، بلکه می بایست Density یا تراکم صفحه های نمایش را در نظر داشته باشد. همانطور که در بالا گفته شد، منظور از Density تعداد پیکسل هایی است که در یک اینچ از صفحه نمایش قرار می گیرند. در واقع هرچه تعداد پیکسل ها در هر اینچ بیشتر باشند بالتبع رزولوشن صفحه بیشتر بوده و دستگاه از کیفیت نمایش بیشتری برخوردار خواهد بود.اکنون با دانستن این نکته که صفحه نمایش دستگاه های اندرویدی بر اساس dpi که مخفف Dots per inch به معنی "تعداد نقطه در هر اینچ" گروه بندی می شوند، همواره بایستی این نکته را مد نظر قرار دهیم که در توسعه اپلیکیشن برای سیستم عامل اندروید برای مشخص کردن عناصر روی صفحه مثل دکمه ها، فاصله مابین عناصر روی صفحه و همچنین اندازه متن، استفاده از واحد پیکسل کار صحیحی نیست چرا که به طور مثال 111 پیکسل در یک دستگاه با dpi بالا با 111 پیکسل در یک دستگاه با dpi پایین یکسان نخواهد بود بنابراین نتایج متفاوتی را مشاهده خواهیم کرد.
آشنایی با واحد اندازه گیری dip
رویکرد صحیح در رابطه با واحد انتخابی برای عناصر مورد استفاده در GUI یا همان "رابط گرافیکی کاربر" که در یک اپلیکیشن اندروید همان layout است dip می باشد که مخفف واژگان Device Independent Pixel است)این واحد اندازه گیری هم به صورت dip و هم به صورت dp نوشته می شود(. در حقیقت dip یک واحد پیکسلی مجازی است که بر اساس یک صفحه نمایش با رزولوشن 160 dpiطراحی شده است. به عبارت دیگر یک dip معادل با یک پیکسل در یک صفحه نمایش که دارای 160نقطه در هر اینچ است می باشد.به عبارت دیگر چنانچه کلیه عناصر در یک layout را در توسعه اندروید بر حسب dip تعیین کنیم، این اطمینان را خواهیم داشت که به طور مثال یک دکمه در دستگاه هایی با صفحه هایی با تراکم متفاوت به طور متناسب بزرگ یا کوچک خواهد شد.
آشنایی با واحد اندازه گیری sp
در ارتباط با واحد dip بایستی توجه کرد که این واحد اندازه گیری به هیچ وجه تنظیمات دستگاه اندرویدی را مد نظر قرار نخواهد داد. برای روشن شدن این مطلب به ذکر مثالی می پردازیم. فرض کنیم که فرد کهنسالی یک گوشی با سیستم عامل اندروید دارد و از آنجا که وی دارای بینایی ضعیفی است تنظیمات تلفن همراه ایشان به نحوی است که کلیۀ متون را بزرگ تر از حد معمول نمایش می دهد. حال اگر ما اپلیکیشنی طراحی کنیم که از واحد اندازه گیری dip در UI آن استفاده شده باشد و فرد فوق الذکراپلیکیشن ما را نصب کند به هیچ وجه قادر نخواهد بود تا اندازه فونت ها را بزرگ تر از آنچه ما تعریف کرده ایم بکند. برای رفع این مشکل یک واحد اندازه گیری دیگر در اندروید تحت عنوان sp که مخفف واژگان Scale Independent Pixel است)توجه داشتن باشیم که برخلاف dip در واحد sp نمی بایست حرف اول کلمه Independent را در مخفف قرار دهیم(. در حقیقت نحوه عملکرد واحد sp همانند dip است با این تفاوت که واحد اندازه گیری sp تنظیمات دستگاه اندرویدی را نیز برای نمایش
متون مد نظر قرار می دهد.
در واقع در مثال فوق اگر واحد های اپلیکیشن خود را به sp تغییر دهیم، فردی که دارای بینایی ضعیفی است با تغییر تنظیمات تلفن همراه خود به منظور بزرگ تر نشان دادن متون، قادر خواهد بود تا متون داخل اپلیکیشن ما را نیز بزرگ تر از حد معمول ببیند.نقطه ضعف واحد اندازه گیری sp
اگرچه که واحد اندازه گیری sp به افرادی که داری بینایی ضعیفی هستند کمک بسیاری می کند تا بتوانند اندازه متون اپلیکیشن را بیشتر کنند اما این در حالی است که از لحاظ زیبایی شناسی و همچنین چیدمان عناصر داخل UI زمانیکه از واحد اندازه گیری sp استفاده کنیم ممکن است با مشکل مواجه شویم. به طور مثال فرض کنیم که اندازه متون اپلیکیشن خود را در حدی انتخاب کرده ایم که با عکس های موجود در layout یک هارمونی مناسبی داشته باشد. حال چنانچه کاربری تنظیمات تلفن همراه یا تبلت خود را به منظور بزرگ تر نشان دادن متون تغییر داده باشد، نه تنها این هارمونی مابین چیزهای قرار گرفته روی UI به هم می خورد بلکه این احتمال نیز وجود دارد که برخی از متون از صفحه نمایش نیز خارج شوند. بنابراین در حین استفاده از این واحد اندازه گیری می بایست بسیار دقت کرد) واحد اندازه گیری که در این سری از آموزش ها استفاده خواهیم کرد واحد اندازه گیری dip است(.فرمول تبدیل واحد اندازه گیری dip به Pixel
به طور کلی برای اینکه متوجه شویم که یک dip در دستگاه هایی با Density متفاوت معادل با چند پیکسل است، می بایست در ابتدا تعداد dpi های صفحه نمایش مد نظر را تقسیم بر عدد 160 کرده سپس عدد حاصله را ضرب در اندازه شیئ خود بر حسب dip بکنیم. برای روشن تر شدن این مسئله به ذکر یک مثال می پردازیم. فرض کنیم که یک تلفن همراه داریم که رزولوشن آن برابر با 240 dpi است. در اپلیکیشن خود یک UI داریم که حاوی متنی است که اندازه آن معادل با 20 dip است. حال می خواهیم ببینیم که این متن معادل با چند پیکسل می باشد. در ابتدا عدد 240 را بر عدد 160 تقسیم می کنیم که می شود 1.5 سپس این عدد را در عدد 20 ضرب می کنیم که می شود 30 . در حقیقت این متن ما دارای اندازه 31 پیکسل در دنیای واقعی است.استفاده از مطالب این مقاله با ذکر منبع راسخون بلامانع می باشد.
/ج