我有
RelativeLayout
A---BIG IMAGE
B---MEDIUM IMAGE
C---SMALL IMAGE
图片看起来像这样
我使用了下面的java代码
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
// LEFT
case R.id.tblLOne:
System.out.println("IMG_L_A");
playBeep(TABLA_L_BIG);
changeLeftDrum();
break;
case R.id.tblLTwo:
System.out.println("IMG_L_B");
playBeep(TABLA_L_MID);
changeLeftDrum();
break;
case R.id.tblLThree:
System.out.println("IMG_L_C");
playBeep(TABLA_L_SMALL);
changeLeftDrum();
break;
return false;
}
return true;
}
问题在于,每当我点击小(黑色)图像
时我得到了以下输出
IMG_L_A
IMG_L_B
IMG_L_C
每当我点击中间图像,我就会
IMG_L_A
IMG_L_B
在 OuterImage大图片
上IMG_L_A
为什么我会把它全部放在ImageView的OnTouch方法
之后它与 onClick 完美配合,但 OnTouch
答案 0 :(得分:5)
这是因为视图堆叠在一起。
这里重要的一点是要知道从onTouchListener
返回的布尔标志的重要性。布尔标志告诉android是否消耗了该事件。
假设您触摸tblRthree
,case R.id.tblLThree
执行,但是由于您返回false,因此知道该事件未被消耗且此事件冒泡到tblRTwo
视图位于tblRthree
视图后面,它为case R.id.tblLTwo
执行相同的侦听器,但是然后再次返回false,它会查看tblROne
并执行所有三种情况。
每当你使用这个事件时你应该返回true,否则你应该返回false。
答案 1 :(得分:0)
onTouch
方法将在多个事件中调用,您只需检查它是否为MotionEvent.ACTION_DOWN
。
所以,它看起来像这样:
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()!=MotionEvent.ACTION_DOWN)
{
return false;//we are not going to handle it
}
switch (v.getId()) {
// LEFT
case R.id.tblLOne:
System.out.println("IMG_L_A");
playBeep(TABLA_L_BIG);
changeLeftDrum();
break;
case R.id.tblLTwo:
System.out.println("IMG_L_B");
playBeep(TABLA_L_MID);
changeLeftDrum();
break;
case R.id.tblLThree:
System.out.println("IMG_L_C");
playBeep(TABLA_L_SMALL);
changeLeftDrum();
break;
}
return true;//we have handled it
}