安卓里处理View的触摸事件主要靠三个方法:dispatchTouchEvent()、onInterceptTouchEvent() 和 onTouchEvent()。
触摸事件的传递顺序是这样的:
1. Activity → 2. PhoneWindow → 3. DecorView → 4. 子View
流程大概是:
一有触摸事件,首先调 dispatchTouchEvent()。这个方法决定事件往哪走,它会先看 onInterceptTouchEvent() 返回啥。
onInterceptTouchEvent() 是 ViewGroup 才有的,用来判断要不要拦截事件。如果返回 true,就代表我自己来处理,事件就交给当前 ViewGroup 的 onTouchEvent() 处理;如果返回 false,就不拦截,继续往下传给子 View。
然后子 View 再走自己的 dispatchTouchEvent(),重复这套流程。
onTouchEvent() 就是真正干活的地方,点按、滑动这些具体操作都在这儿处理。如果 onTouchEvent() 返回 true,表示消费了这个事件,不然就往上回传,看有没有别的 View 要处理。
简单总结就是:
事件一层层往下派发,靠 dispatch 来转发,用 intercept 判断拦不拦,最后 onTouch 来处理。整个过程从外到内分发,拦截看 ViewGroup 态度,处理看 onTouch 是否接手。一套组合拳打下来,搞定各种手势操作~
触摸事件的传递顺序是这样的:
1. Activity → 2. PhoneWindow → 3. DecorView → 4. 子View
流程大概是:
一有触摸事件,首先调 dispatchTouchEvent()。这个方法决定事件往哪走,它会先看 onInterceptTouchEvent() 返回啥。
onInterceptTouchEvent() 是 ViewGroup 才有的,用来判断要不要拦截事件。如果返回 true,就代表我自己来处理,事件就交给当前 ViewGroup 的 onTouchEvent() 处理;如果返回 false,就不拦截,继续往下传给子 View。
然后子 View 再走自己的 dispatchTouchEvent(),重复这套流程。
onTouchEvent() 就是真正干活的地方,点按、滑动这些具体操作都在这儿处理。如果 onTouchEvent() 返回 true,表示消费了这个事件,不然就往上回传,看有没有别的 View 要处理。
简单总结就是:
事件一层层往下派发,靠 dispatch 来转发,用 intercept 判断拦不拦,最后 onTouch 来处理。整个过程从外到内分发,拦截看 ViewGroup 态度,处理看 onTouch 是否接手。一套组合拳打下来,搞定各种手势操作~