آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

کوثر  11 سال پیش  10 سال پیش
+9 0

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

0 0
از تکنیک masking استفاده کنید. قبلا در این لینک توضیح دادم و سورس هم گذاشتم. (11 سال پیش)
0 0
لینکو دیدم اما به نتیجه ای نرسیدم.منبع واضح تری میدونید؟؟توی فیلما هست؟ (11 سال پیش)
0 0
توضیحات بیشتر اضافه شد در پایین. (11 سال پیش)
 برای این سوال 7 پاسخ وجود دارد.
پاسخ به سوال 
hamidd  11 سال پیش
+2 0

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

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

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

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

پاسخ به سوال 
کاشی زاده  11 سال پیش
+8 0

برای اینکه با استفاده از یک عکس ما بتونیم برای موقعیت های مختلف،  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;
}
}

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

 

موفق باشید :)

 

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

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

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

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

پاسخ به سوال 
Morteza  11 سال پیش
0 0

اینجوریه:

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

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

درست نمیشه:(

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

این ارور:

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

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