我有过
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。
发布于 2015-01-23 13:39:44
这是因为风景堆积如山。
这里重要的一点是要知道从onTouchListener
返回的布尔标志的重要性。布尔标志告诉android事件是否已被消耗。
假设您触摸了tblRthree
,case R.id.tblLThree
执行,但是由于您返回false,在android看来,该事件似乎没有被消耗,并且该事件气泡到位于tblRthree
视图后面的tblRTwo
视图,该视图为case R.id.tblLTwo
执行相同的侦听器,然后再次返回false --因此,它会冒泡到查看tblROne
,并执行所有三种情况。
当您使用事件时,您应该返回true,而在不使用事件时,应该返回false。
发布于 2015-01-23 14:15:29
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
}
https://stackoverflow.com/questions/28110933
复制相似问题