دانلود اندروید استودیو

محیط برنامه‌نویسی Android Studio بر پایهٔ IntelliJ IDEA ساخته شده و می‌تونید از سایت برنامه‌نویسان اندروید دانلودش کنید.image03به خاطر تحریم و بسته‌بودن این سرویس برای ایران، روی سروری در خارج از ایران دانلودشون کردم و لینک‌هاشون رو اینجا گذاشتم و می‌تونید دانلودشون کنید. این‌ها لینک‌های دانلود v2.2 هست (stable) و اگه فک می‌کنید نسخهٔ جدید‌تری اومده، از طریق توئیتر خبر بدید تا آپدیتشون کنم.

نکته حواستون باشه که IDEها به تنهایی به دردتون نمی‌خوره و باید برا هر پلتفرم، SDK اش رو هم بگیرید.

مک ( SDK | IDE )

لینوکس ( SDK | IDE )

ویندوز ( BUNDLE | SDK | IDE )

 

انیمیشن برای عناصر لیست و گرید

از همان اوایل کار، تغییرات عناصر رابط کاربری در اندروید، خشن و بدون هیچ انیمیشنی بود. رفته رفته در نسخه‌های جدیدتر اندروید به این موضوع بیشتر اهمیت داده شد، ولی باز جای خالی آن دیده می‌شود. البته همان‌طور که می‌دانید، انیمیشن‌ها صرفاً برای زیبایی نیستند و وظیفهٔ اصلی آن‌ها فهماندن بهتر آن‌چه که در رابط کاربری اتفاق می‌افتد به کاربر و در کل بهتر کردن ارتباط کاربر با نرم‌افزار است.

برای مثال، فرض کنید یک لیست دارید که حاوی تعدادی آیتم است. اگر قرار باشد جای آیتمی از لیست عوض شود، روشی که در اندروید به صورت پیش فرض استفاده می‌شود این است که سورس دیتا عوض شده و notifyDataSetChanged آداپتر مربوط به لیست صدا زده می‌شود، و ترتیب آیتم‌ها بدون هیچ‌گونه انیمیشنی تغییر داده می‌شود. نبود انیمیشن باعث می‌شود که کاربر متوجه جابجا شدن آیتم‌ها نشود و یا نفهمد که دقیقا چه آیتمی جابجا شد و به کجای لیست رفت. برای حل این مشکل، کلاسی نوشتم که این کار را به سادگی برایتان انجام می‌دهد.

برای استفاده از این کلاس، تنها کافیست در آداپتری که به ListView یا GridView ست می‌کنید، به جای BaseAdapter، کلاس BaseAnimatedAdapter را ارث ببرید. این کلاس به جای getView، مجبورتان می‌کند getTaggedView را پیاده کنید و در نتیجه هم از شما به جای View، یک TaggedView می‌خواهد. کافی‌ است پس از ساختن View که قرار بود getView آن‌را برگرداند، یک TaggedView بسازید، با ورودی‌های همان View ای که ساخته اید، و پارامتری دیگر، که بین آیتم‌های لیست شما unique است. مثلا برای لیستی از مخاطبین، این پارامتر می‌تواند id آن مخاطب در لیست مخاطبین باشد. جنس این پارامتر مهم نیس چه باشد و تنها چیزی که مهم است، unique بودن آن است. در گام دوم، باید متد getColumnCount را پیاده‌سازی کنید و تعداد ستون‌های لیستتان را برگردانید. برای استفاده در ListView عادی، باید ۱ بازگردانید.

Animated List شما آماده است!

لینک کد

تنظیم gravity و layout_gravity برای layout های دوزبانه

ممکن است برای شما هم پیش آمده باشد که خواسته‌ باشید برای حالت انگلیسی و فارسی بخشی از اپ خود از یک layout استفاده کنید و به خاطر gravity، layout_gravity یا چیزهای دیگری از این قبیل مجبور شده‌ باشید که دو layout جدا بسازید که خصوصیت مذکورشان متفاوت است. قطعا یک بدی این راهکار این است که مجبورید هر تغییری در ساختار این layout را دو بار اعمال کنید. یک راهکار بهتر برای حل مشکل گفته شده این است که برای حالت فارسی و انگلیسی تو style جدا بسازید و خصوصیت موردنظر (مثلا gravity) را در آن تغییر دهید و style مذکور را به layout مورد نظر بدهید. این روش کمی بهتر از روش قبل خواهد بود، ولی اگر layout شما خودش style داشت، باید دو زیرکلاس برای style آن layout تعریف کنید و از آن‌ها استفاده کنید. که البته راه نسبتا مناسبی به نظر می‌رسد. ولی، یک راه جالب‌تر برای این کار وجود دارد، و باعث می‌شود درگیر style آن layout نشوید. این راه ممکن است کمی کثیف به نظر بیاید، ولی در عوض باحال‌تر است! اینکه یک آیتم به صورت زیر در فایل integers.xml در فولدر values فارسی و انگلیسی قرار دهید:

[values-fa/integers.xml]

<integer name=”bidi_gravity”>5</integer>

[values-en/integers.xml]

<integer name=”bidi_gravity”>3</integer>

 و در layout موردنظر، این تغییر را بدهید:

[layout/some_layout.xml]

android:gravity=”@integer/bidi_gravity”

….

به همین راحتی! قضیه از این قرار است که بیشتر attribute های اندروید مانند gravity مقدار int می‌گیرند و کافی‌است راهی پیدا کنید تا مقدار مورد نظر را به آن attribute بدهید. اگر نگاهی به کلاس Gravity بیندازید، می‌بینید که برای هر کدام از مقادیر آن، عددی در نظر گرفته شده است. مثلا LEFT = 3 و RIGHT = 5 است. این اعداد را در فایل integers وارد کرده بودیم. اگر هم مثلا می‌خواهید مقدار right|center_vertical را به gravity بدهید، کافیست مقادیر right و center_vertical از کلاس Gravity را با هم or کنید و مقدار تولیدشده را در integers.xml قرار دهید.

البته ممکن است IDE تان به فایل layout گیر بدهد که اینا چیه نوشتی! در این‌صورت، بالای تگ view مورد نظر عبارت زیر را بنویسید:

    <!–suppress AndroidDomInspection –>

این عبارت، ارور گفته شده را برطرف خواهد کرد. ولی حواستان باشد که عبارت اخیر، ارورهای دیگر مربوط به این tag را نیز خفه خواهد کرد.

کار با ابزار View Hierarchy

گاهی اوقات پیش می‌آید که view برنامهٔ شما رفتاری را که دوست دارید، نشان نمی‌دهد. مثلا می‌خواهید TextView ای را سمت راست شی دیگری قرار دهید، ولی موفق نمی‌شوید. گاهی نیز، می‌خواهید ساختار layout برنامهٔ دیگری را بررسی کنید تا ببینید چگونه پیاده‌سازی شده است و viewهای آن چه سلسله مراتبی دارد. در این مواقع، ابزار View Hierarchy به کمکمان می‌آید.

برای کار با این ابزار، در اکلیپس، و یا هر IDE دیگری، به بخش DDMS مراجعه کنید، طبق شکل، دستگاه مورد نظر خود را از لیست انتخاب کنید و دکمهٔ Dump View Hierarchy را بزنید.

Screen Shot 2013-05-03 at 5.13.15 AMپس از قدری تأمل، تبی باز خواهد شد که حاوی اجزای صفحه‌ای است که dump گرفتیم.

Screen Shot 2013-05-03 at 5.23.44 AM

با حرکت بر روی اجزای مختلف، می‌توانید آن‌ها را انتخاب کنید و خصوصیات مختلفشان از جمله clickable بودن یا نبودن، طول و عرض و … را در قسمت راست – پایین ببینید. قسمت راست-بالا نیز ساختار سلسله مراتبی اجزای صفحه را نشان می‌دهد و با انتخاب هر کدام از viewها، می‌توانید مرز آن را به رنگ قرمز در نمای سمت چپ صفحه مشاهده کنید. توجه کنید که این ابزار تنها viewهایی را که قابل نمایش هستند، نشان می‌دهد و آن‌هایی که طول یا عرض صفر دارند، یا gone و invisible هستند، در این ابزار قابل مشاهده نیستند.

 

 

نکاتی در مورد طراحی برنامه‌های اندرویدی

سیستم‌عامل اندروید، با اینکه حضوری گسترده میان تلفن‌های هوشمند دارد، با انتقادهایی در مورد کیفیت برنامه‌هایش روبرو است. در ادامه، نکاتی چند، در رابطه با بهبود برنامه‌های اندرویدی مطرح می‌کنیم:

نگذارید کاربرانتان منتظر بمانند

فرض کنید یک برنامهٔ خبرخوان نوشته‌اید. دو حالت را متصور می‌شویم. اول اینکه کاربر با مراجعه به برنامهٔ شما، منتظر بارگذاری خبرها باشد، و دوم اینکه خبرها در پس‌زمینه بارگذاری شده باشند، و کاربر به محض مراجعه به برنامه‌تان، همه چیز را مهیا یابد. قطعاً در حالت دوم، حس بهتری به کاربر منتقل خواهید نمود. البته این کار بنا به دلایل مختلف، همیشه امکان‌پذیر نیست.
در مواردی که کاربر مجبور خواهد بود کمی منتظر بماند تا محتوای برنامهٔ شما بارگذاری شود، سعی کنید progress bar ای برای این مدت به او نشان دهید، تا حوصله‌اش سر نرود. اینکه کاربر حس کند برنامه کاری انجام نمی‌دهد، برایش خوش‌آیند نخواهد بود.

رابط کاربری پلتفرم‌های دیگر را استفاده نکنید

اندروید، مانند iOS و دیگر پلتفرم‌ها، استانداردها و الگو‌های طراحی کاربری خودش را دارد. سعی نکنید طراحی‌ای که مثلا برای برنامهٔ iOS خود کرده‌اید را عیناً وارد برنامهٔ اندرویدی خود کنید، وگرنه کار با برنامهٔ شما، تجربه‌ٔ دشواری برای او خواهد داشت.

کاربران خود را راهنمایی کنید

کاربران از ابتدای شروع کار با برنامهٔ شما، دنبال این هستند که برنامه‌تان چگونه کار می‌کند. اینکه چگونه می‌توانند محتوایی که دنبالش می‌گردنند را پیدا کنند. یا اینکه چه کار‌های دیگری با برنامهٔ شما می‌توانند بکنند. نگذارید کاربران در برنامهٔ شما گیج بزنند و رابط کاربری خود را طوری طراحی کنید که راحت‌تر و سریع‌تر بتوانند جواب این سوالات را پیدا کنند. سعی کنید قبل از انتشار برنامهٔ خود، از تعدادی از دوستانتان کمک بگیرید و از آن‌ها بخواهید با برنامهٔ شما کار کنند و تجربهٔ خود را بگویند. به این تجربه‌ها اهمیت دهید.

به دستگاه‌های مختلف اهمیت دهید

شاید این مورد کمی بی‌ربط به موارد قبل به نظر برسد، ولی از مواردی است که در بسیاری از برنامه‌ها رعایت نمی‌شود. سعی کنید در طراحی برنامهٔ خود، حالت‌های افقی و عمودی را در نظر بگیرید، کاربران در حالت‌های مختلف از دستگاهشان استفاده می‌کنند. از انیمیشن‌ها و افکت‌های سنگین استفاده نکنید، همهٔ کاربران دستگاه‌های قوی ندارند. صفحه‌های نمایش بزرگ را لحاظ کنید، برنامه‌های موبایل روی تبلت‌ها زشت دیده می‌شوند.

index_landing_page

خلاصه‌ای در مورد launchMode در اندروید

ممکن است خودتان هم تجربه کرده باشید که اجرای activity ها در اندروید به چند نحو انجام می‌گیرد. مثلا:

unnamed

در یک برنامهٔ پخش موسیقی، ممکن است دلیلی نداشته باشیم که نسخه‌های مختلفی از activity ای که عکس آلبوم و دکمه‌های play و pause را دارد، داشته باشیم. شاید به نظرمان منطقی بیاید که چنین activity ای، اصولا باید تنها یک نسخه داشته باشد و به هنگام پخش موسیقی بعدی، این activity با اطلاعات موسیقی جدید پر شود. با گرفتن چنین تصمیمی ممکن است از ویژگی‌های دیگری باز مانده باشیم. مثلا اینکه این activity بتواند از خارج از برنامهٔ ما، فایلی را دریافت و شروع به پخش آن کند. در این‌صورت، و با توصیف بالا، اگر موسیقی دیگری در حال پخش می‌بود، از بین می‌رود و activity مذکور، با اطلاعات موسیقی‌ای که از بیرون باز شده بود، پر می‌شود.

این مسئله در عدهٔ زیادی از برنامه‌های اندرویدی مراعات نمی‌شود و باعث گیج‌شدن کاربر و گم‌شدن مسیرش می‌شود.

حال به بررسی حالات مختلفی که یک activity برای اجرایش می‌تواند به خود بگیرد را بررسی می‌کنیم. اجازه بدهید ابتدا به مفهومی به نام task بپردازیم.

در اندروید، activity هایی که ریشهٔ یکسانی دارند، در یک task قرار دارند. درواقع اگر یک activity از ریشهٔ دیگری به غیر از ریشهٔ اصلی برنامه شروع شده باشد، در task دیگری قرار دارد.

original

حال به بررسی حالت‌های مختلف launchMode در یک activity می‌پردازیم. همان‌طور که می‌دانید، launchMode یکی از خصوصیات تگ activity است که در فایل AndroidManifest.xml مربوط به پروژه قابل تعریف است.

برای launchMode، چهار حالت مختلف وجود دارد:

  1. standardاین حالت، حالت پیش‌فرض اجرای یک activity است. نسخه‌های مختلفی از چنین activity ای می‌تواند ساخته شود.
  2. singleTop: این حالت، مشابه standard است، با این تفاوت که در صورت وجود داشتن نسخه‌ای از activity، نسخه‌های دیگر درست نمی‌شوند، و intent مربوط به آن‌ها به متد onNewIntent نسخهٔ موجود از activity، تحویل داده می‌شوند.
  3. singleTask: در این حالت، activity تنها می‌تواند ریشهٔ یک task باشد، و activity های دیگر می‌توانند پاره‌ای از task‌ مربوط به آن باشند. در واقع به هنگام فراخوانی intent ای به چنین activity، سیستم یک task‌ جدید ایجاد می‌کند و ایشان را در ریشهٔ آن قرار می‌دهد. البته اگر نسخه‌ای از این activity موجود باشد، همانند حالت singleTop، متد onNewIntent نسخهٔ موجود با intent‌ جدید فراخوانی خواهد شد.
  4. singleInstance: این حالت، از نظر ریشهٔ task جدید بودن مشابه singleTask است، با این تفاوت که هیچ activity دیگری حق اجراشدن در task مربوط به این activity را ندارد.

همان‌طور که در documentation اندروید هم نوشته شده است، مورد‌های singleInstance و singleTask کاربری‌های خاصی دارند و معمولا در برنامه‌های عادی، تنها حالت‌های standard و singleTop را لازم خواهیم داشت.

(منبع)

طراحی رابط کاربری در اندروید

از زمانی که تعداد برنامه‌های اندرویدی رو به افزایش گذاشت، جای خالی طراحی در اندروید احساس می‌شد. برنامه‌های اندرویدی، اغلب زشت بودند و علاوه بر آن، شباهتی به هم‌دیگر نداشتند. مشکل نبودن شباهت این بود که هنگام کار با هر برنامه‌ای، تجربه‌ای متفاوت به دست می‌آمد و باعث می‌شد کاربر الگوی خاصی برای کار با برنامه در ذهنش نداشته باشد. این، باعث سختی کار با برنامه‌ها می‌شد.

ugly

تا اینکه تیم اندروید عزمشان را جزم کردند و بخش طراحی اندروید را برای حل این مشکلات نوشتند. مطالعهٔ این بلاگ و مراعات کردن موارد گفته شده در آن، باعث بهبود رابط کاربری برنامهٔ شما خواهد بود.

index_landing_page

رعایت نکات مندرج در این سایت تنها باعث زیباتر شدن و افزایش کارایی برنامه خواهد شد و در این بلاگ، راهکار خاصی برای اینکه برنامهٔ خود را چگونه طراحی کنید، ارائه نشده است. در واقع این شما هستید که باید تصمیم بگیرید بخش‌های مختلف برنامهٔ خود را چگونه طراحی کنید؛ اما، قبل از آن بد نیست نگاهی به برنامه‌های مشابه بیاندازید. سایت‌های زیر، چند نمونه از جاهایی است که می‌توانید اسکرین‌شات‌های برنامه‌های زیبا و کارا را ببینید.

نکته‌ٔ مهمی که در مورد این سایت‌ها وجود دارد، این است که اکثر آن‌ها نمونه‌های برنامه‌های سیستم‌عامل iOS هستند. برنامه‌های این سیستم‌عامل معمولا فانتزی‌تر از برنامه‌های اندروید هستند و مهم‌تر از آن، قراردادهای طراحی‌ای که اصولا باید در برنامه‌های اندرویدی رعایت شوند، در این برنامه‌ها وجود ندارند. لذا هنگام استفاده از ایده‌های این برنامه‌ها، حواستان باشد که استانداردهای اندروید را رعایت کنید.

androidpttrns.com

androidux.com

pttrns.com

inspired-ui.com

lovelyui.com

patternsofdesign.co.uk

tapfancy.com

tappgala.com