Android触摸分发方法总结

一. 概述
1.只有view,ViewGroup,Activity 具有事件分发和消费的功能。
2.其中只有ViewGroup有事件拦截功能即onInterceptTouchEvent()。
2.Activity的dispatchTouchEvent方法很奇怪

ruturn true代表自己消费了事件(在dispatchTouchEvent()内处理)
return false则没有任何响应,即事件被废弃没有消费
return super.dispatchTouchEvent(ev)代表着向下分发。

二.三个方法
1.public boolean dispatchTouchEvent(MotionEvent ev)
当触摸事件发生的时候,首先会被当前的Activity进行分发,即当前Activity的dispatchTouchEvent方法会被执行。
这个时候,该方法有三种返回的情况:
return false: 表明事件不会被进行分发。事件会以冒泡的方式被传递给上层的View或Activity的onTouchEvent方法进行消费掉(Activity中return false;该Activity的onTouchEvent不会收到该触摸回调)。
return true:表明该时间已经被处理。事件会被当前View或Activity的dispatchTouchEvent给消费掉。不会再进行传递,事件到此结束。
return super.dispatchTouchEvent(ev):表明该事件将会被分发。此时当前View的onIntercepterTouchEvent方法会捕获该事件,判断需不需要进行事件的拦截。

2.public boolean onInterceptTouchEvent(MotionEvent ev)
该方法用户拦截被传递过来的事件,用于判断被传递过来的事件是否需要被当前的View进行处理。
return false : 不对事件进行拦截,放行该事件。事件会被传递到当前View的子控件中,由子控件中的dispatchTouchEvent方法进行分发处理。
return true : 拦截该事件,将该事件交给当前view的onTouchEvent方法进行处理。
return super.inInterceptTouchEvent(ev):默认拦截方式,和return true一样。该事件会被拦截,将该事件交给当前view的onTouchEvent方法进行处理。(这里需要有一点说明,当有两个View。A View中有一个B View.点击A.A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),则事件将会被A进行拦截,交给A的onTouchEvent()进行处理,如果点击的是B,A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),则事件将不会被拦截,会被分发到子控件中)

3.public boolean onTouchEvent(MotionEvent event)
当前的View把事件进行了拦截,则事件则会被传递到该方法中
return false:表明没有消费该事件,事件将会以冒泡的方式一直被传递到上层的View或Activity中的onTouchEvent事件处理。如果最上层的View或Activity中的onTouchEvent还是返回false。则该事件将消失。接下来来的一系列事件都将会直接被上层的onTouchEvent方法捕获
return true: 表明消费了该事件,事件到此结束。
return super.onTouchEvent(event):默认情况,和return false一样。

三.还有一个常用方法用来处理嵌套滑动很管用requestDisallowInterceptTouchEvent()这个方法子view调用后可以使得父ViewGroup不再走InterceptTouchEvent方法而直接把触摸相应分发给子view处理(注意action_down除外)。

你可能感兴趣的:(Android触摸分发方法总结)