Touch Down 布局阻塞按钮的其他触摸事件

Touch Down on Layout Blocking Other Touch Events of Buttons

我正在几个 ImageButton 上实现点击事件,代码如下所示

  MyTouchListener touchListener = new MyTouchListener();
        l1.setOnTouchListener(touchListener);
        r1.setOnTouchListener(touchListener);
        l2.setOnTouchListener(touchListener);
        r2.setOnTouchListener(touchListener);

 public class MyTouchListener implements View.OnTouchListener {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            switch (v.getId()) {
                case R.id.l1:
                    clickL1(v);
                    break;
                case R.id.r1:
                    clickR1(v);
                    break;
                case R.id.l2:
                    clickL2(v);
                    break;
                case R.id.r2:
                    clickR2(v);
                    break;
            }
            return true;
        }

        return false;
   }

我遇到的问题是,当我将一根手指放在布局上(图像按钮上的任何地方除外)时,按钮在我按住它时不会注册任何事件。

我尝试为我的布局提供自己的触摸侦听器,returns false 但没有用。

我应该如何 "disregard" touch down 布局上的事件并正常收听 imagebutton 事件?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/relativeLayout"
    android:splitMotionEvents="true"
    tools:context="com.example.josip.something.GameOffline">


    <ImageButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/l1"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:focusableInTouchMode="true"/>

    <ImageButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/r1"
        android:layout_above="@+id/l1"
        android:layout_toRightOf="@+id/l1"
        android:layout_toEndOf="@+id/l1"
        android:focusableInTouchMode="true"/>

    <ImageButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/r2"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:focusableInTouchMode="true"/>

    <ImageButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/l2"
        android:layout_above="@+id/r2"
        android:layout_toLeftOf="@+id/r2"
        android:layout_toStartOf="@+id/r2"
        android:focusableInTouchMode="true"/>


<RelativeLayout>

编辑: 在包含按钮的布局中设置 android:splitMotionEvents="true"

而不是 event.getAction() 尝试 MotionEventCompat.getActionMasked(event) 以获得与正确指针索引关联的操作。在这里阅读更多相关信息:enter link description here

只有当你真正处理了一个事件时,你才应该 return true,它在 if { } 语句中。否则 return false

所以我找到了一个解决方案。我将另一个 RelativeLayout 作为主布局的子级和按钮的兄弟级。我让它可以点击,这样当我将手指放在除按钮以外的任何布局上时,它就可以工作,我尝试点击按钮,事件触发。为什么会这样,我不知道,如果有人知道我想解释一下。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/relativeLayout"
    android:splitMotionEvents="true"
    tools:context="com.example.josip.something.GameOffline">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:clickable="true"></RelativeLayout>

    <ImageButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/l1"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:focusableInTouchMode="true"/>

    <ImageButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/r1"
        android:layout_above="@+id/l1"
        android:layout_toRightOf="@+id/l1"
        android:layout_toEndOf="@+id/l1"
        android:focusableInTouchMode="true"/>

    <ImageButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/r2"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:focusableInTouchMode="true"/>

    <ImageButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/l2"
        android:layout_above="@+id/r2"
        android:layout_toLeftOf="@+id/r2"
        android:layout_toStartOf="@+id/r2"
        android:focusableInTouchMode="true"/>


<RelativeLayout>

onTouch里面的returntrue替换成false.
通过这样做,您将告诉 android 将事件传递给下一个处理程序(例如 onClick)。