传递流程
(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。
(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递,默认返回false,返回true表示拦截。
(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。view中onTouchEvent默认返回true表示消费了这个事件。
其中Layout里的onInterceptTouchEvent默认返回值是false,这样touch事件会传递到View控件,Layout里的onTouch默认返回值是false, View里的onTouch默认返回值是true,当我们手指点击屏幕时候,先调用ACTION_DOWN事件,当onTouch里返回值是true的时候,onTouch回继续调用ACTION_UP事件,如果onTouch里返回值是false,那么onTouch只会调用ACTION_DOWN而不调用ACTION_UP.
(4) 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。
(5) OnTouchListener优先于onTouchEvent()对事件进行消费。
上面的消费即表示相应函数返回值为true。
![](https://img-blog.csdnimg.cn/b47559c3a98341faada2bf8fd5ee9578.png)
一.只有view,ViewGroup,Activity 具有事件分发和消费的功能。
二,Activity因为上最先接触到触摸事件,因此Activity没有事件拦截方法。即没有onInterceptTouchEvent方法。
三.对于不能添加子控件的view,不能对事件进行分发和拦截,它只有onTouchEvent事件。
四.public boolean dispatchTouchEvent(MotionEvent ev) 事件分发:
当触摸事件发生的时候,首先会被当前的activity进行分发,即当前activity的dispatchTouchEvent方法会被执行。这个时候,该方法有三种返回的情况:
return false:
表明事件不会被进行分发。事件会以冒泡的方式被传递给上层的view或activity的onTouchEvent方法进行消费掉。
return true:
表明该时间已经被处理。事件会被当前view或activity的dispatchTouchEvent给消费掉。不会再进行传递,事件到此结束。
return super.dispatchTouchEvent(ev):
表明该事件将会被分发。此时当前View的onIntercepterTouchEvent方法会捕获该事件,判断需不需要进行事件的拦截。
五.public boolean onInterceptTouchEvent(MotionEventev) 事件拦截:
该方法用户拦截被传递过来的事件,用于判断被传递过来的事件是否需要被当前的view进行处理。
return false :不对事件进行拦截,放行该事件。事件会被传递到当前view的子控件中,由子控件中的dispatchTouchEvent方法进行分发处理。
return true :拦截该事件,将该事件交给当前view的onTouchEvent方法进行处理。
return super.inInterceptTouchEvent(ev):
默认拦截方式,和returntrue一样。该事件会被拦截,将该事件交给当前view的onTouchEvent方法进行处理。(这里需要有一点说明,当有两个view。Aview中有一个Bview.点击A.A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),则事件将会被A进行拦截,交给A的onTouchEvent()进行处理,如果点击的是B,A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),则事件将不会被拦截,会被分发到子控件中)
六.public boolean onTouchEvent(MotionEventevent) 事件处理
当前的view把事件进行了拦截,则事件则会被传递到该方法中
return false:
表明没有消费该事件,事件将会以冒泡的方式一直被传递到上层的view或Activity中的onTouchEvent事件处理。如果最上层的view或Activity中的onTouchEvent还是返回false。则该事件将消失。接下来来的一系列事件都将会直接被上层的onTouchEvent方法捕获
return true:
表明消费了该事件,事件到此结束。
return super.onTouchEvent(event):
默认情况,和return false一样。