بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

تعریف لینک در عکس

مدیریت گفتگو
کوثر 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام دوستان یه مشکل اساسی دارم.یه عکس به صورت زیر درون پروژم دارم حالا میخوام با کلیک روی هر قسمت از این شکل عمل مربوطه صورت بگیرد.سوالم دقیقا اینه که چطور باید عمل کنم؟

نظرات

hamidd 11 سال پیش
از تکنیک masking استفاده کنید. قبلا در این لینک توضیح دادم و سورس هم گذاشتم.
کوثر 11 سال پیش
لینکو دیدم اما به نتیجه ای نرسیدم.منبع واضح تری میدونید؟؟توی فیلما هست؟
hamidd 11 سال پیش
توضیحات بیشتر اضافه شد در پایین.

پاسخ‌ها 7

hamidd 11 سال پیش

اگه میخواین وقتی هر جایی از عکس کلیک شد به لینک خاصی بره. باید برای imageview مورد نظرتون onclicklistener بنویسید و کد زیر رو درش قرار بدید:

 			String url = "http://google.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

مجوز اینترنت هم یادتون نره.

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

نظرات

کاشی زاده 11 سال پیش

برای اینکه با استفاده از یک عکس ما بتونیم برای موقعیت های مختلف،  Onclick های مختلف تعریف کنیم نیاز هست زمانی که روی اون عکس کلیک میشه ما موقعیت  جایی که عمل تپ صورت گرفته رو به دست بیاریم .

پس نیاز داریم که برای اون عکس یک متد رو Override کنیم .

ما onTouch رو Override میکنیم و کد های زیر رو توش مینویسیم :

 public boolean onTouch (View v, MotionEvent evenet) {
boolean handledHere = false;

final int action = evenet.getAction();

final int evenetX = (int) evenet.getX();
final int evenetY = (int) evenet.getY();
}

ما میتونیم با استفاده از این متد موقعیت تپ رو پیدا کنیم و بر اساس اون یک رخدادی رو نمایش بدیم .

ولی محاسبه اینکه اون منطقه مورد نظر خیلی سخته که دقیق در بیاد .

حالا میخوام روشی رو بکار ببندیم که این مشکل رو حل کنیم.

ما برای اینکه یه محدوده رو مشخص کنیم باید یک علامتی برای اون منطقه در نظر بگیریم .

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

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

برای شروع کار شما عکس مورد نظرتون رو توی Photoshop باز میکنید . روی عکستون یک لایه دیگه ایجاد میکنید و با استفاده از قلم مکان هایی که قرار هست کلیک بشن رو با رنگ های مختلف پر میکنید .

همونطور هم که در بالا مشخصه من 2 تا از جعبه هارو با رنگ سبز (0f0) و قرمز (f00) پر کردم.

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

حالا لایه مربوط به عکس رو پاک کنید و لایه که رنگ کردید رو ذخیره کنید .

هر دو عکس رو به پروژه برنامتون اضافه کنید .

حالا داخل لایه xml که برای نمایش این عکس ساختید به این صورت عمل کنید :

1- یک لایه با استفاده از FrameLayout ایجاد میکنید .

2- عکس اصلیتون رو داخل لایه قرار میدید .

3- عکسی که نقش ماسک یا همون تریگر ما رو داره رو روی عکس اصلی قررار میدید.

همونطور که میدونید در Frame Layout لایه های روی هم قرار میگیرند .

4-عکسی که مربوط به لایه تریگر یا ماسک شما هست رو از نظر Visibility روی invisible قرار بدید .

خب ، کار ما با لایه xml تموم شد و منو ما آماده هست میریم سراغ کد های java .

در ابتدا به ImageView اصلیتون دسترسی پیدا میکنید

  ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setOnTouchListener(this);

و براش یک لیسنر Touch مینویسید ، میتونید لیسنرتون رو impelement هم بکنید مثل من .

حالا یه متد مینویسم که رنگ نقاطی که روی عکس کلیک شده رو بهمون برگردونه :

 
public int getHotspotColor(int image, int x, int y) {
ImageView imageView = (ImageView) findViewById(image);

if (imageView == null) {
return 0;
}

imageView.setDrawingCacheEnabled(true);

Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache());

if (bitmap == null) {
return 0;
}

imageView.setDrawingCacheEnabled(false);
return bitmap.getPixel(x, y);
}

به یک متد دیگه هم نیاز داریم تا برای ما رنگ هارو تشخیص بده  :

  public boolean colorMatch(int color1, int color2, int tolerance) {

if ((int) Math.abs(Color.red(color1) - Color.red(color2)) > tolerance) {
return false;
}

if ((int) Math.abs(Color.green(color1) - Color.green(color2)) > tolerance) {
return false;
}

if ((int) Math.abs(Color.blue(color1) - Color.blue(color2)) > tolerance) {
return false;
}

return true;
}

این متد 3 ورودی میگیره ، اولی رنگی که ما مد نظرمون هست ، دومی رنگی که از محل کلیک بدست آوردیم و سومی هم دامنه تغییرات .

خب حالا میریم سراغ OnTouch :

  @Override
public boolean onTouch(View view, MotionEvent event) {
final int action = event.getAction();

final int eventX = (int) event.getX();
final int eventY = (int) event.getY();

switch (action) {
case MotionEvent.ACTION_DOWN:
return true;

case MotionEvent.ACTION_UP:

int touchColor = getHotspotColor(R.id.image_trigger, eventX, eventY);

if (colorMatch(Color.RED, touchColor, 25)) {
/*
* Red Area
*/
Log.i("LOG", "Red");
} else if (colorMatch(Color.GREEN, touchColor, 25)) {
/*
* Green Area
*/
}

return true;

default:
return false;
}
}

خب با این روش شما میتونید برای کلیک شدن روی هر قسمت از عکستون کاری که دوست دارید رو انجام بدید .

 

موفق باشید :)

 

نظرات

hamidd 11 سال پیش
البته قبلا تو این لینک هم سورسش رو گذاشتم که منطقش یکیه. اون سورس هم اگه بخواین می تونین دانلود کنید.
hamidd 11 سال پیش
ممنون محمدحسین بابت توضیحات خوبت. البته اینی که محمدحسین گذاشته بهتره، چون من اون سورس رو تمیز و مرتب نکرده بودم. (ولی اونم کار می کنه)
کوثر 11 سال پیش
مرسی دوستان خیلی عالی بود
Morteza 11 سال پیش
اگه 20 تا باشه چی کار کنیم؟ 3 تا نباشه مثل اینجا
Morteza 11 سال پیش

من خواستم این کارو برای چند رنگ دیگه هم انجام بدم اما ارور داد عکسشو میذارم اگه میشه کمکم کنید

نظرات

کاشی زاده 11 سال پیش
میگه همچین رنگی رو نمیشناسم ، به این صورت بنویسید Color.BLACK همه حرفش بزرگ باشه
Morteza 11 سال پیش
اولش با حروف بزرگم نوشتم ولی بازم تعریف نشره بود براش:(
کاشی زاده 11 سال پیش
اروری که داره میده مربوط به اشتباه معرفی کردن رنگ هست . شما میتونید از هر رنگی استفاده کنید هیچ مشکلی نداره .
Morteza 11 سال پیش

بعد میخوام با Color.parsecolor یک رنگو بنویسم ولی بازم نمی شه.
آخه رنگام زیاده و مجبورم رنگای اینجوری بذارم.

نظرات

Morteza 11 سال پیش

اینجوریه:

نظرات

کاشی زاده 11 سال پیش
اصلا یادم رفته بود چی نوشتم قبلا ، درسته من فکر کردم دارید رنگ اصلی رو میگیرید . اونجا ما فقط RGB رو میگیریم رنگتون رو توی متد مربوط به تاچ بنویسید .
Morteza 11 سال پیش
چجوری اضافه کنم؟
Morteza 11 سال پیش

اینجا ینی؟اینجا ینی؟

درست نمیشه:(

نظرات

کاشی زاده 11 سال پیش
متوجه نیمشم ینی چی درست نمیشه منظورت این هست روی مناطق مشکلی کلیک میکنید کار نمیکنه ؟
Morteza 11 سال پیش
ینی اون اروری که میگف مشکی تعریف نشدس هست هنوز بد پروژه اجرا نمیشه:(
کاشی زاده 11 سال پیش
الا من اروری نمیبینم توی عکسی که قرار دادید .
Morteza 11 سال پیش

این ارور:

نظرات

کاشی زاده 11 سال پیش
عرض کردم ما توی اون متد فقط RGB میگیریم ینی رنگ های Red , Green , Blue این مربوط به بخش تشخیص رنگ هست مثلا رنگ مشکلی از 000000 تشکیل میشه ینی رنگ قرمزش 0 هست ، سبزش 0 هست و آبی هم 0 شما فقط رنگتون رو متد onTouch معرفی میکنید و به قسمت تشخیص رنگ کاری ندارید .
Morteza 11 سال پیش
خب رنگامو چجوری تو متود مربوط به تاچ بنویسم که غیر RGB هم قبول کنه؟:(
کاشی زاده 11 سال پیش
من فگر میکنم مبحث رنگ ها برای شما خوب جا نیوفتاده ، پیشنهاد میکنم برید آموزش استاد در رابطه با رنگ ها رو گوش کنید تا مشکلتون حل بشه .
Morteza 11 سال پیش
ممنونم:)
jafarmazareei 11 سال پیش
سلام. این روش که تریگر میسازیم روش جالبیه. حالا یه سوال دارم فقط. بر اساس رنگ، موقعیت تپ رو نشون میده و ontouch رو واسش مینویسیم. حالا بخوایم روی هر قسمت این عکس، یک تکست ویوی متن قرار بدیم چکار باید کنیم. بطوریکه وقتی عکس بزرگ میشه روی اندازه ی صفحه ی بزرگتر، تکست ویو هم موقعیتش بر اساس موقعیت اون دکمه ی رنگی عوض بشه. ممنون میشم.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .