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

Sid*_*mit 4 android android-layout android-view

我有

 RelativeLayout

       A---BIG IMAGE
       B---MEDIUM IMAGE
       C---SMALL IMAGE
Run Code Online (Sandbox Code Playgroud)

图片看起来像这样

在此处输入图片说明

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

    }
Run Code Online (Sandbox Code Playgroud)

问题是,每当我单击小图像(黑色)时

我得到以下输出

IMG_L_A
IMG_L_B
IMG_L_C
Run Code Online (Sandbox Code Playgroud)

每当我点击中间的图像

IMG_L_A
IMG_L_B
Run Code Online (Sandbox Code Playgroud)

OuterImage大图上

IMG_L_A
Run Code Online (Sandbox Code Playgroud)

为什么我全都落后于ImageView的OnTouch方法

它与onClick完美搭配,但与OnTouch搭配却不完美

Shi*_*rma 5

这是因为视图相互堆叠。

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

假设您触摸tblRthreecase R.id.tblLThree然后执行,但是由于返回false,因此在android上似乎未使用该事件,并且该事件冒泡到tblRTwo视图后面的tblRthree视图,该视图对的对象执行相同的侦听器,case R.id.tblLTwo但随后您又返回false,所以冒泡查看tblROne并执行所有三种情况。

每当您使用事件时,都应返回true;否则,您应返回false。