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
里面的return
true
替换成false
.
通过这样做,您将告诉 android 将事件传递给下一个处理程序(例如 onClick
)。
我正在几个 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
里面的return
true
替换成false
.
通过这样做,您将告诉 android 将事件传递给下一个处理程序(例如 onClick
)。