واحدهای اندازهگیری
تماشای برخط [لینک مستقیم] فیلم آموزشی «واحدها»
زیر نویس انگلیسی [English Subtitle]
دریافت نسخهی pdf این آموزش [352 کیلوبایت]
وقتی که برای اندازههای مختلف صفحه می خوایم برنامه درست کنیم، اولین چیزی که لازمه بدونیم واحدهای اندازهگیری در اندرویده، تا بتونیم طوری برنامه رو توسعه بدیم که تو اندازه صفحههای مختلف به درستی نمایش داده بشه.
۱.خوب برای اینکه بهتر متوجه بشیم، یه پروژه جدید در ایکلیپس میسازیم.
از فولدر res زیر شاخه layout و activity_main.xml رو باز میکنیم و محیط گرافیکی اون برامون باز میشه. به طور پیشفرض صفحهبندی نسبی (RelativeLayout) برای همه پروژهها در نظر گرفته شده. حالا اگه روی activity_main.xml کلیک کنیم می بینیم که در اولین خط نوشته RelativeLayout یعنی نوع صفحه بندی نسبی است.
۲.حداقل تنظیماتی که هر شی در اندروید نیاز داره، ارتفاع و عرض در صفحهبندیه. مثلا در قسمت صفحهبندی نسبی نوشته :
یعنی عرض و ارتفاع صفحه بندی به صورتی باشه که تمام فضای والد خودش رو پر کنه (fill_parent) یعنی تمام صفحه رو بپوشونه.
حالا میتونیم به قسمت گرافیکی activity_main.xml بریم و اون متن رو حذف کنیم و از منوی سمت چپ یه دکمه روی صفحه بکشیم و رها کنیم. وقتی به قسمت کد activity_main.xml میریم میبینیم که اون هم برای خودش ارتفاع و عرض داره که با عبارت «wrap_content» پر شده، به این معنی که فقط به همون اندازه که نیاز داره، فضا اشغال میکنه.
android:layout_width="wrap_content" android:layout_height="wrap_content"
۳.برای دیدن مشخصات دکمهای که ایجاد کردیم، از منوی سمت راست properties رو انتخاب میکنیم (اگه منوی properties رو ندارید، از منوی بالای ایکلیپس روی window بعد show view و other کلیک کنید و در زیرشاخه General گزینه properties رو انتخاب کنید تا براتون پنجره اش باز بشه و اگه دلتون بخواد میتونید اونو در سمت راست بذارید) این منو به ما اجازه میده مشخصات هر چیزی که در قسمت گرافیکی انتخاب کردیم رو تغییر بدیم. الان میتونید رو دکمهای که تو شکل مشخص کردم (پر کردن ارتفاع: toggle fill height) کلیک کنید تا بینید که در قسمت توضیحات درباره ارتفاع دکمه نوشته شده : match_parent به این معنی که طول اون شی رو انقدر اضافه میکنه تا به اندازه والدش بشه و در محیط گرافیکی میبینیم که همین طور هم شده.
در کنار دکمه پر کردن ارتفاع (toggle fill height)، دکمه پر کردن عرض هم وجود داره، که اگه اون رو برای شیای انتخاب کنید، باعث میشه شی تمام عرض والدش رو پر کنه.
قبل از GingerBread وقتی این دکمه رو میزدید، مینوشت fill_parent که در واقع همون کارو میکرد ولی الان اسمش رو عوض کردن گذاشتن match_parent
۴.حالا اگه بخوایم شی مورد نظرمون یه عرض و ارتفاع مشخصی داشته باشه باید چی کار کنیم؟ کاری که اکثر افراد میکنن اینه که یه مقدار با واحد pixel به اون شی اختصاص میدن. ولی یک پیکسل در دستگاههای مختلف اندازه متفاوتی داره مثلا یه شرکت دوست داره مقدار پیکسل رو یک دهم اینچ در نظر بگیره و یه شرکت دیگه یه مقدار متفاوتی رو، و این باعث میشه تا برنامه ما روی هر دستگاهی یه جور متفاوت باشه، به همین خاطر باید از یه واحد دیگه به نام dp استفاده کنیم که مخفف Device-Independent Pixle هست یعنی پیکسلی که مستقل از دستگاهه و برای همه دستگاههای اندروید یه چیز ثابته، قبلا sdk بهمون این اجازه رو میداد که هر واحدی که میخوایم رو استفاده کنیم، اما چون باعث میشد برنامه در دستگاههای مختلف متفاوت نمایش داده بشه، دیگه الان sdk به شما اجازه نمیده واحد px رو بنویسید و خودش به dp تبدیلش میکنه.
۵.حالا اون دکمه رو از رو صفحه حذف میکنیم و یه متن (textView) به صفحه اضافه میکنیم، میخوایم اندازه متن رو تغییر بدیم. میتونیم از همون واحد dp استفاده کنیم. مثلا 50 dp. ولی یه تنظیماتی در اندروید برای افرادی که چشمان ضعیفی دارند وجود داره که میتونن گزینهای رو انتخاب کنن تا همه متنها براشون درشتتر نمایش داده بشه، در چنین حالتی این متن ما همون اندازه خواهد موند و براشون بزرگ نمیشه، برای برطرف کردن این مشکل از واحد sp استفاده میکنیم، که مخفف Scale-Indepentent Pixle هست به معنی اینکه با توجه به مقیاسی که کاربر تنظیم کرده متن نمایش داده بشه و این واحد فقط برای متن به کاربرده میشه. و اگر کاربر تنظیمات گوشی اش رو دست نزده باشه، اندازه 50 dp برابره 50 sp خواهد شد، ولی برای افرادی که چشماشون ضعیفه بزرگتر نمایش داده خواهد شد.