我正在使用ImageView.onTouch()
。
我为ACTION_MOVE
返回false,但仍然消耗了onTouch()
个事件。
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent ev) {
System.out.println("jan25 iv onTouch");
if (ev.getActionMasked()==MotionEvent.ACTION_DOWN) {
System.out.println("jan25 iv ACTION_DOWN");
return true;
}
if (ev.getActionMasked()==MotionEvent.ACTION_MOVE){
System.out.println("jan25 iv ACTION_MOVE");
return false;
}
if (ev.getActionMasked()==MotionEvent.ACTION_UP){
System.out.println("jan25 iv ACTION_UP");
return true;
}
System.out.println("jan25 iv false");
return false;
}
});
布局:
<LinearLayout
android:id="@+id/ll_magic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/red"
android:orientation="vertical" >
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/abcd"
/>
</LinearLayout>
请知道
答案 0 :(得分:1)
似乎从视图的false
回调中返回onTouchEvent()
仅在收到ACTION_DOWN
的第一个动作事件时有效。在非消费视图上设置OnTouchListener
具有相同的语义。这似乎是dispatchTouchEvent()
中ViewGroup
实施中的错误。在这么长的时间之后它似乎不会被修复,因为这会破坏错误地依赖于这种行为的实现。
作为解决方法,您可以设置一个标志,指示触摸事件的处理,并在处理之前进行检查。收到ACTION_UP
或ACTION_CANCEL
动作事件后,应重置此标志。
答案 1 :(得分:0)
自: http://developer.android.com/guide/topics/ui/ui-events.html
onTouch() - 返回一个布尔值,指示您的侦听器是否使用此事件。重要的是这个事件可以有多个相互跟随的动作。因此,如果在收到向下操作事件时返回false,则表示您尚未使用该事件,并且对此事件的后续操作也不感兴趣。因此,您不会在事件中调用任何其他操作,例如手指手势或最终的上行动作事件。
因此返回false不应该消耗该事件。你是如何确定事件被消耗的?
答案 2 :(得分:0)
这也有效,但我仍然不能100%确定你要做什么。这会将imageView可单击设置为false,因此应该允许触摸不被它消耗。另外,我添加了clickable到LinearLayout。
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent ev) {
System.out.println("jan25 iv onTouch");
if (ev.getActionMasked()==MotionEvent.ACTION_DOWN) {
System.out.println("jan25 iv ACTION_DOWN");
return true;
}
if (ev.getActionMasked()==MotionEvent.ACTION_MOVE){
System.out.println("jan25 iv ACTION_MOVE");
imageView.setClickable(false);
return false;
}
if (ev.getActionMasked()==MotionEvent.ACTION_UP){
System.out.println("jan25 iv ACTION_UP");
return true;
}
System.out.println("jan25 iv false");
return false;
}
});
<LinearLayout
android:id="@+id/ll_magic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/red"
android:clickable = "true"
android:orientation="vertical" >
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/abcd"
/>
</LinearLayout>