تعویض resource در ImageView
سلام
دوتا ImageView دارم که میخوام با تاچ رو هر کدوم Resource هاشون با هم عوض شه
خودم اینو مینویسم ولی میگه محتویات setImageResources باید int باشه
img1.setImageResource(img2.getResources());
چیکار کنم ؟
پیشاپیش از کمکتون ممنونم
عذر خواهی ! ، دستور قبلی اشتباه بود ، برای رفع ابهام نحوه ی استفاده از اونم میگم
setImageDrawable(getResources().getDrawable(R.drawable.icon));
اما در کل این دستور ساده تره :
img.setImageResource(R.drawable.img);
اگه گیره اینی که چرا int میگیره ، علت رو من اینجوری فهمیدم !
تو فایل R.java که توی پوشه ی gen هست ، آدرس یه خونه از حافظه رو به صورت Hex درون یه متغییر int ذخییره میکنه ، اگه بازش کنی میبینی ! اینم یه نمونه دستور
public static final int img=0x7f020000;
حالا تو وقتی ریسورس رو عوض کنی تمومه دیگه ! ، نمیدونم چرا اینفدر کشش میدی ، نشد پروژه رو بزار دان کنیم ، ولی پروژه ی لامپ که فکر کنم پارت 3 هست رو حتما ببین
بهتره هنگامی که به یک imageview تصویری رو نسبت می دید به خاصیت tag آن هم ان تصویر را نسبت دهید تا به راحتی از آن استفاده کنید .
img1.setImageResource(R.drawable.image1);
img1.setTag(Integer.valueOf(R.drawable.image1));
img2.setImageResource(R.drawable.image2);
img2.setTag(Integer.valueOf(R.drawable.image2));
و اینگونه جابجا کنید
img1.setImageResource(img2.getTag());
اصل خواسته ام اینه: که اگه رو قرمزه تاچ شد سبزه بشه قرمزه و همزمان قرمزه بشه سبزه(نه اینکه تبدیل شن ، جاشون عوض شه)
و در مورد آبیه هم الان اگر روش تاچ شد بشه قرمزه (چون الان بزرگه قرمز شده) و قرمزه بشه آبیه و حالا که جاشون عوض شده برعکس

باید از این متد استفاده کنید:
setImageResource()
که استاد هم توی یکی از فیلم ها(دقیقا یادم نیست کدوم بود!) طریقه ساخت یک لامپ ،که با کلیک کردن روشن و خاموش میشد رو آموزش داده بود.
منم این مشکل رو داشتم ولی از یک راه دیگه حلش کردم.میخواستم عکسی که بین 4 تا ImageView که هر 3 ثانیه عکساشون عوض میشه و کلیک شده رو بگیرم و در فرم بعدی فول سایز و با اسکرول افقی و عمودی نشونش بدم.
برای این کار مجبور شدم زمانی که ImageView رو مقداردهی میکنم یک متغیر String هم مقدار بدم و برای فرستادن آدرس عکس از اون متغیر استفاده کنم
کد ها خیلی زیاده و بر اساس گفته ی استاد فقط قسمتی که مورد استفاده ی شماس رو گذاشتم
فرستادن به فرم بعدی :
OnClickListener imageClickListener = new OnClickListener() {
@Override
public void onClick(View image) {
Intent intent = new Intent(ActivityMain.this, ActivityDownload.class);
intent.putExtra("THUMBNAIL_LOCAL_SOURCE", selectedFileSdcardPath);
ActivityMain.this.startActivity(intent);
}
};
پر کردن ImageView ها :
public static void setImageBackground(String request) {
if (request.contains("image-thumbnail-" + imageIndex + ".jpg")) {
Bitmap bitmap = BitmapFactory.decodeFile(request);
img[0].setImageBitmap(bitmap);
}
else if (request.contains("image-thumbnail-" + (imageIndex + 1) + ".jpg")) {
Bitmap bitmap = BitmapFactory.decodeFile(request);
img[1].setImageBitmap(bitmap);
}
else if (request.contains("image-thumbnail-" + (imageIndex + 2) + ".jpg")) {
Bitmap bitmap = BitmapFactory.decodeFile(request);
img[2].setImageBitmap(bitmap);
}
else if (request.contains("image-thumbnail-" + (imageIndex + 3) + ".jpg")) {
Bitmap bitmap = BitmapFactory.decodeFile(request);
img[3].setImageBitmap(bitmap);
}
selectedFileSdcardPath = request;
}
وای بچه ها من قاطی کردم. خدا به داد برسه.
اول از همه ، می دونیم که چطور میشه یک Resource رو روی ImageView بارگزاری کرد ( در واقع به گفته دوستان پروژه لامپ هست )
دوم از همه :) می رسیم اینجا که از کجا بفهمیم که هر ImageView کدوم Resource رو داره که هزار تا راه فوق العاده ساده داریم:
روش اول
بجای استفاده از Resource از Bitmap استفاده کنید، مثلاً
Bitmap bitmapRed = BitmapFactory.decodeResource(getResources(), R.drawable.red);
img1.setImageBitmap(bitmapRed);
بعدش بجای مقایسه از این عبارت استفاده کنید:
Bitmap imageSource = ((BitmapDrawable) img1.getDrawable()).getBitmap();
if (imageSource == bitmapRed){
Log.i("LOG", "img1 source is R.drawable.red");
}
روش دوم
از این عبارت برای مقایسه استفاده کنید ( زمانیکه Resource بجای Bitmap بارگزاری کردید )
if (img1.getDrawable().getConstantState().equals(
getResources().getDrawable(R.drawable.red).getConstantState())) {
Log.i("LOG", "img1 source is R.drawable.red");
}
روش سوم
به گفته ALU جان از setTag استفاده کنید.
روش چهارم
از HashMap به شکل زیر استفاده کنید:
HashMap<ImageView, Integer> resourceMap = new HashMap<ImageView, Integer>();
//after setImageResource do
resourceMap.put(img1, R.drawable.red);
//for get loaded resource
int resource = resourceMap.get(img1);
روش پنجم
از یک MyImageView استفاده کنید:
public class MyImageView extends ImageView {
....
private int imageResource;
public void setResource(int resource){
this.setImageDrawable(resource);
this.imageResource = resource;
}
public int getResource(){
return this.imageResource;
}
}
دیگه 995 روش دیگه با خودتون :)
و اما راه حل مشکل شما ( زمانی که فقط تعویض مد نظرتون باشه و نه مقایسه )
Drawable img1Drawable = img1.getDrawable();
Drawable img2Drawable = img2.getDrawable();
img1Drawable.setImageDrawable(img2Drawable);
img2Drawable.setImageDrawable(img1Drawable);
به همین سادگی و به همین خوشمزگی
مرسی استاد عجله ای نیست اما اگه و اگه وقت کردین ویدئوی اینها رو هم لطفا تدوین کنید
اما تو آخرین بخش جوابتون که جواب سوال منو دادین وقتی اول img1 رو مقدار دهی میکنم و تبدیل به مقدار img2 میشه دیگه تبدیل شده، خط بعد که اجرا میشه چون جفت ِتصاویر الان یکی شده دیگه تعویضشون معنی نداره ، به این صورت که وقتی کد به شکل ِ
img2.setImageDrawable(img1.getDrawable()); img1.setImageDrawable(img2.getDrawable());
نوشته میشه، دو تصویر تبدیل به تصویر ِimg1 میشه و وقتی به صورت ِ
img1.setImageDrawable(img2.getDrawable()); img2.setImageDrawable(img1.getDrawable());
نوشته میشه، دو تصویر به تصویر ِimg2 تبدیل میشن
چه باید کرد؟
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
