我正在几个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>
答案 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
)。