Android中的onTouchListener将检测所有父视图上的触摸

时间:2015-01-23 13:25:16

标签: android android-layout android-view

我有

 RelativeLayout

       A---BIG IMAGE
       B---MEDIUM IMAGE
       C---SMALL IMAGE

图片看起来像这样

enter image description here

我使用了下面的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

2 个答案:

答案 0 :(得分:5)

这是因为视图堆叠在一起。

这里重要的一点是要知道从onTouchListener返回的布尔标志的重要性。布尔标志告诉android是否消耗了该事件。

假设您触摸tblRthreecase 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
}