Android触摸事件之Down事件
最近因为答辩,需要整理一下触摸事件。
但是关于Down事件,它是一个触摸动作的起始,它的处理和对其他事件的处理在细节上是有不同的,总觉得逻辑有些凌乱,所以写个demo帮助理解一下。
首先是自定义View,父View继承了LinearLayout,子View继承TextView,简单覆写了两者的触摸方法,加了Log方便观察。
1.子View和父View的onTouchEvent方法相同:
都是返回super.onTouchEvent(event):
![](https://img.haomeiwen.com/i1116207/7f8dd6b225f43f24.png)
此时触摸TextView,Log是长这样的:
![](https://img.haomeiwen.com/i1116207/f75ea4598aad0ec8.png)
此时,LinearLayout的onTouchEvent,onInterceptTouchEvent,以及TextView的onTouchEvent返回的都是false。
2.在1的基础上,
将TextView的onTouchEvent改为true。
返回的Log:
![](https://img.haomeiwen.com/i1116207/f32dcc406174c62a.png)
3.在1基础上,将LinearLayout的onTouchEvent改为true,
TextView的onTouchEvent改为false。
返回的Log:
![](https://img.haomeiwen.com/i1116207/db7f81b29d109fb7.png)
4.在1基础上,
将LinearLayout的onTouchEvent改为true
将TextView的onTouchEvent改为true。
结果和2一致。
5.在1的基础上,
将LinearLayout的dispatchTouchEvent改为只拦截Down事件,且
onTouchEvent事件返回true.
将TextView的onTouchEvent改为true。
![](https://img.haomeiwen.com/i1116207/f2e4ef2ec186d8c7.png)
结果长这样:
![](https://img.haomeiwen.com/i1116207/15516a0c77ea18c7.png)
6.在1基础上,
将LinearLayout的dispatchTouchEvent改为只不拦截Down事件,且
onTouchEvent事件返回true.
将TextView的onTouchEvent改为true。
![](https://img.haomeiwen.com/i1116207/f53104f3565aa7c4.png)
![](https://img.haomeiwen.com/i1116207/92f461cf978dc9a2.png)
7.在1基础上,
将LinearLayout的dispatchTouchEvent改为只拦截Down事件,且
onTouchEvent事件返回false.
将TextView的onTouchEvent改为true。
![](https://img.haomeiwen.com/i1116207/b8bca777b9452324.png)
8.在1基础上,
将LinearLayout的dispatchTouchEvent改为只不拦截Down事件,且
onTouchEvent事件返回false.
将TextView的onTouchEvent改为true。
![](https://img.haomeiwen.com/i1116207/903d80e913a6eafc.png)
综上:
-
对于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事件来临。