Android触摸事件之Down事件

最近因为答辩,需要整理一下触摸事件。
但是关于Down事件,它是一个触摸动作的起始,它的处理和对其他事件的处理在细节上是有不同的,总觉得逻辑有些凌乱,所以写个demo帮助理解一下。
首先是自定义View,父View继承了LinearLayout,子View继承TextView,简单覆写了两者的触摸方法,加了Log方便观察。

1.子View和父View的onTouchEvent方法相同:
都是返回super.onTouchEvent(event):

Android触摸事件之Down事件_第1张图片

此时触摸TextView,Log是长这样的:

此时,LinearLayout的onTouchEvent,onInterceptTouchEvent,以及TextView的onTouchEvent返回的都是false。

2.在1的基础上,
将TextView的onTouchEvent改为true。
返回的Log:

Android触摸事件之Down事件_第2张图片

3.在1基础上,将LinearLayout的onTouchEvent改为true,
TextView的onTouchEvent改为false。
返回的Log:

Android触摸事件之Down事件_第3张图片

4.在1基础上,
将LinearLayout的onTouchEvent改为true
将TextView的onTouchEvent改为true。
结果和2一致。

5.在1的基础上,
将LinearLayout的dispatchTouchEvent改为只拦截Down事件,且
onTouchEvent事件返回true.
将TextView的onTouchEvent改为true。


Android触摸事件之Down事件_第4张图片

结果长这样:

Android触摸事件之Down事件_第5张图片

6.在1基础上,
将LinearLayout的dispatchTouchEvent改为只不拦截Down事件,且
onTouchEvent事件返回true.
将TextView的onTouchEvent改为true。

Android触摸事件之Down事件_第6张图片
Android触摸事件之Down事件_第7张图片

7.在1基础上,
将LinearLayout的dispatchTouchEvent改为只拦截Down事件,且
onTouchEvent事件返回false.
将TextView的onTouchEvent改为true。

8.在1基础上,
将LinearLayout的dispatchTouchEvent改为只不拦截Down事件,且
onTouchEvent事件返回false.
将TextView的onTouchEvent改为true。

Android触摸事件之Down事件_第8张图片

综上:

  • 对于ViewGroup,也就是父View,如果在onTouchEvent中对于Down属性的事件的返回值:
    true:该事件被消费,之后的move,up不经过它自身的intercept判断,直接进入它的onTouchEvent被处理。
    false:没有消费down事件,之后的move,up需要经过自身的intercept,拦截。

  • 对于View,也就是子View,如果在onTouchEvent中对于Down属性的事件的返回值:
    true:该事件被消费,之后的Move,Up仍然要经过它的父View的intercept方法判断,如果被父View劫走,它将收到到一个Cancel事件。
    false:只要没有消费该Down事件,之后的Move和Up就真的说再见了,直到下一个Down事件来临。

你可能感兴趣的:(Android触摸事件之Down事件)