سلام. امروز تصمیم گرفتم یه آموزش خیلی ساده اما واقعا کاربردی براتون قرار بدم. دقت کنید در این آموزش به مباحث نمایش تصویر از sd کارت، نمایش تصویر از آدرس اینترنتی، نمایش تصویر از پوشه drawable برنامه پرداخته خواهد شد. یه لایبرای توی اندروید هست به نام پیکاسو این لایبراری از قوی ترین لایبراری های موجود توی ضمینه نمایش تصویر هست. توی این آموزش بهتون یاد میدم که چجوری از این لایبراری استفاده کنید.
اگه شما از اندروید استودیو استفاده می کنید خط زیر رو به dependencies اضافه کنید
compile 'com.squareup.picasso:picasso:2.5.2'
اما اگه از اکلیپس استفاده می کنید نسخه نهایی فایل jar پیکاسو رو از وبسایت رسمی خودش دریافت کنید. (وبسایت رسمی لایبرای پیکاسو کلیک کنید)
بعد از اینکه لایبراری رو به پروژه تون اضافه کردید میتونیم کار رو شروع کنیم.
نمایش تصویر از آدرس اینترنتی:
Picasso.with(context).load("YOUR PIC ADRESS").into(imageView);
شما به جای YOUR PIC ADDRESS آدرس تصویر خودتون رو بزارید. و به جای imageView اسم ایمیج ویو خودتون رو بزارید.
دقت کنید که شما می تونید این کد رو توی آداپتور های لیست ویو یا گرید ویو یا ریسایکلر ویو قرار بدید که خوبیش سرعت بالا و کش کردن تصاویره یعنی بار اول که تصویر رو از اینترنت نشون داد همون تصویر رو ذخیره میکنه و برای بار بعدی وقتی اون آدرس رو خوند دیگه دانلود نمیکنه و همون ذخیره شده رو نشون میده (البته اگه درست خونده باشم.) من خیلی از این کتابخونه استفاده میکنم.
نمایش تصویر از sd card یا حافظه داخلی:
Picasso.with(context).load(new File("Your Address From SD Card")).into(imageView3);
دقت کنید که آدرس تصویر توی sd card رو به صورت استرینگ به جای Your Address From SD Card قرار بدید.
تجربه من از نمایش تصویر sd card یا حافظه داخلی اینه که من همیشه قبل از آدرس تصویر file:/// رو هم وارد میکنم چون هیچوقت تا حالا بدون این کار نکرده.
نمایش تصویر از drawable:
برای نمایش تصویری که توی برنامه قرار دادید و میخواهید به کاربر نمایش بدید چند تا راه داره یکیش این راه هست که به نظرم با وجود کد های خود اندروید برای پروژه های ساده نیازی به استفاده از پیکاسو برای این کار نیست.
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
توابع کاربردی کتابخانه پیکاسو:
پیکاسو دارای یه توابعی هست که توضیحشون خالی از لطف نیست.
تابع resize و centerCrop:
تابع resize دو مقدار طول و عرض رو میگیره و تصویر رو همون اندازه نشون میده. و کار تابع centerCrop دقیقا همون کاریه که ما برای imageView از توی فایل xml مقدار scaleType رو تنظیم میکنیم.
تابع placeholder:
این تابع یک تصویر رو از drawable برنامه میگیره و تا زمانی که تصویرتون لود نشده نشون میده.
تابع error:
این تابع هم یه تصویر رو از drawable به عنوان ورودی میگیره. این تابع زمامی عمل میکنه که url داده شده اشتباه باشه و یا اون آدرس امکان باز شدن رو نداشته باشه یا آدرس شما آدرس یک تصویر نباشه و زمانی که عمل میکنه تصویری رو که بهش دادید میزاره روی imageview
گرفتن Bitmap توسط پیکاسو (از آدرس اینترنتی و یا حافظه داخلی و یا drawable برنامه):
این عمل زمانی نیاز میشه که شما نمیخواهید مستقیم بیت مپ یا تصویرتون رو توی imageView بریزید بلکه یه کار دیگه ای باهاش دارید مثلا میخواهید اون bitmap رو ویرایش کنید و... پس نیاز دارید تا بیت مپ رو داشته باشید. برای این کار از کد زیر استفاده میکنیم.
private Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
}
private void someMethod() {
Picasso.with(this).load("url").into(target);
}
@Override
public void onDestroy() { // could be in onPause or onStop
Picasso.with(this).cancelRequest(target);
super.onDestroy();
}
در کد بالا وقتی شما متد someMethod رو صدا بزنید پیکاسو فعال میشه و url رو میخونه و میده به تارگت برای اینکه شما به بیت مپ گرفته شده دسترسی داشته باشید توی تارگت یه تابع onBitmapLoaded وجود داره که میتونید بیت مپ رو به عنوان ورودی از تابع بگیرید و هر بلایی که دوست دارید سرش بیارید.
خب دوستان اگه باز هم مشکلی داشتید با پیکاسو یه صلوات برای شادی روحش بفرستید مشکل حل میشه
شوخی کردم اگه مشکلی بود در خدمتم می تونید از قسمت سوالات بپرسید تا جواب بدم.
ravi میگه:
سلام خسته نباشید من خیلی مبتدی هستم یه سوال داشتم اونم اینه که چطوری میشه بیش از یک عکس رو نمایش داد؟مثلا 10 تا عکس
محمد فلاح به این سوال پاسخ داده که:
سلام دوست عزیز. ببینید برای اینکه 10 تا تصویر رو نشون بدید دو تا راه دارید یکی اینکه شما به صورت دستی 10 تا imageView رو بزارید کنار هم و همشون رو توی کلاس صدا بزنید و مقدار دهی کنید و.... یکی هم اینکه شما از لیست ویو (در نسخه جدید اندروید ریسایکلر ویو) استفاده کنید. ببنید مثلا فرض کنید شما میخواید 100 تا تصویر رو نشون بدید: کافیه که یه لیست ویو (یا ریسایکلر ویو) بزارید توی فایل xml و یه آداپتر براش بسازید و هرچی که دلتون میخواد تصویر نمایش بدید. حالا کار این لیست ویو (یا همون ریسایکلر ویو که نسخه بهبود یافته لیست ویو هست) چیه؟ ببینید لیست ویو کاری رو که انجام میده اینه که شما فقط یه ایتم (مثلا یه آیتمی که فقط شامل یه عکس باشه) رو میسازید و لیست ویو اون رو هرچند بار که شما بخواید پشت سر هم تکرار میکنه و شما میتونید توی هر کدوم از اینا یه تصویر متفاوت نشون بدید. مثال در برنامه دیوار: برنامه دیوار رو که باز میکنید صفحه اولش تمامی کالا ها رو به شما نشون میده این با یه لیست ویو طراحی شده یعنی فقط یک آیتم (شامل تکست ویو برای تیتر، imageView برای عکس محصول و یه تکست ویو دیگه برای زمانش) این آیتم به ازای هر محصول و کالا تکرار میشه و با آداپتوری که براش مینویسن توی هر آیتم تیتر و عکس و زمانش تعییر میکنه و اینجوری دیوار به وجود میاد. به همین سادگی..... امیدوارم متوجه شده باشید. موفق باشید یاعلی