触摸布局阻止按钮的其他触摸事件

时间:2016-08-24 20:17:21

标签: android android-layout ontouchlistener ontouchevent android-imagebutton

我正在几个ImageButtons上实现tap事件,代码看起来像这样

  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;
   }

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

我尝试给我的布局提供了自己的触摸侦听器,它返回false但是没有用。

我应该怎样做才能“忽视”布局中的触碰事件,只是正常听取图像按钮事件?

<?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>

3 个答案:

答案 0 :(得分:0)

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

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

只有在您真正处理了true语句内的事件时,才应返回if { }。否则返回false

答案 1 :(得分:0)

所以我找到了解决方案。我将另一个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>

答案 2 :(得分:0)

return内的true onTouch替换为false 通过这样做,您将告诉android将事件传递给下一个处理程序(例如onClick)。