Skip to content

Commit 750b616

Browse files
committed
touch
1 parent 44941a1 commit 750b616

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#Android中View的触摸事件涉及到哪些方法?他们之间有什么关系?
2+
3+
在Android中的View触摸事件处理主要涉及以下三个方法
4+
5+
- dispatchTouchEvent()
6+
- onInterceptTouchEvent()
7+
- onTouchEvent()
8+
9+
View的触摸事件传递,从前到后按照以下顺序
10+
11+
1. Activity
12+
2. PhoneWindow
13+
3. DecorView
14+
4. 子View
15+
16+
他们之间的关系如下
17+
18+
- 当触摸事件来临时,dispatchTouchEvent()会被调用,它的返回值由onInterceptTouchEvent()和child.dispatchTouchEvent()共同决定
19+
- 在dispatchTouchEvent()中,onInterceptTouchEvent()会被调用,onInterceptTouchEvent()决定的是当前ViewGroup是否对触摸事件进行拦截,如果返回true,则触摸事件由当前ViewGroup的onTouchEvent()处理,否则触摸事件会被分发到子View,由子View进行处理。
20+
- onTouchEvent()中对具体的触摸事件进行处理。
21+
22+
他们之间的关系可以用伪代码标示,如下:
23+
24+
```
25+
public boolean dispatchTouchEvent(MotionEvent ev) {
26+
boolean consume = false;
27+
if (onInterceptTouchEvent(ev)) {
28+
consume = onTouchEvent(ev);
29+
} else {
30+
consume = child.dispatchTouchEvent(ev);
31+
}
32+
return consume;
33+
}
34+
```
35+
36+
另外,ViewGroup.onInterceptTouchEvent()默认返回false,即对触摸事件不进行拦截,都会分发到子View。
37+
38+
如果View设置了onTouchListener(),则onTouchListener()的处理在onTouchEvent()之前,如果onTouchListener()返回true,则View.onTouchEvent()不会被调用,即onTouchListener()的优先权高于onTouchEvent()
39+
40+
Android中默认认为View是消耗onTouchEvent()的,即返回值为true,除非它是不可点击的,即clickable和longClickable都为false。
41+
42+
#更多参考资料
43+
44+
- Android开发艺术探索-第三章 View的事件体系
45+
46+
#关于我
47+
48+
江湖人称『凯子哥』,其实就是一个闷骚的90后技术宅,Android开发者,喜欢技术分享,热爱开源。
49+
50+
- 我的CSDN博客:[http://blog.csdn.net/zhaokaiqiang1992](http://blog.csdn.net/zhaokaiqiang1992)
51+
- 我的微博:[裸奔的凯子哥](http://weibo.com/zhaokaiqiang1992),每天会不定时分享高质量博客,欢迎关注
52+
- 微信公众账号:kaizige1992
53+
54+
![](http://i12.tietuku.com/f55c34ddb1ba3830.jpg)

0 commit comments

Comments
 (0)