view的事件分发机制
事件分发有两种,第一是View,第二是ViewGroup。事件分发主要有三大核心
1.public boolean dispatchTouchEvent(MotionEvent event) —— 分发事件
2.public boolean onInterceptTouchEvent(MotionEvent event) —— 拦截事件
3.public boolean onTouchEvent(MotionEvent event) —— 消费事件
MotionEvent 主要分为以下几个事件类型:
ACTION_DOWN 手指开始触摸到屏幕的那一刻响应的是DOWN事件
ACTION_MOVE 接着手指在屏幕上移动响应的是MOVE事件
ACTION_UP 手指从屏幕上松开的那一刻响应的是UP事件
执行顺序:ACTION_DOWN -> ACTION_MOVE -> ACTION_UP
1.分发事件
事件分发是核心的一个步骤,如果分发没弄懂,我们会发现事件其他view的事件好像都没有往下继续了。
一般在这个方法里必须写 return super.dispatchTouchEvent 。如果不写super.dispatchTouchEvent,而直接改成return true 或者 false,则事件传递到这里时便终止了,既不会继续分发也不会回传给父元素。
2.拦截
只有ViewGroup才有这个方法。View只有dispatchTouchEvent和onTouchEvent两个方法。因为View没有子View,所以不需要拦截事件。而ViewGroup里面可以包裹子View,所以通过onInterceptTouchEvent方法,ViewGroup可以实现拦截,拦截了的话,ViewGroup就不会把事件继续分发给子View了,也就是说在这个ViewGroup中的子View都不会响应到任何事件了。onInterceptTouchEvent 返回true时,表示ViewGroup会拦截事件。
3.消费
消费也是我们常写的,ontouch事件,onTouchEvent 返回true时,表示事件被消费掉了。一旦事件被消费掉了,其他父元素的onTouchEvent方法都不会被调用。如果没有人消耗事件,则最终当前Activity会消耗掉。则下次的MOVE、UP事件都不会再传下去了。
需要注意的一些事项:
一般我们在自定义ViewGroup时不会拦截Down事件,因为一旦拦截了Down事件,那么后续的Move和Up事件都不会再传递下去到子元素了,事件以后都会只交给ViewGroup这里。
一个Down事件分发完了之后,还有回传的过程。因为一个事件分发包括了Action_Down、Action_Move、Action_Up这几个动作。当手指触摸到屏幕的那一刻,首先分发Action_Down事件,事件分发完后还要回传回去,然后继续从头开始分发,执行下一个Aciton_Move操作,直到执行完Action_Up事件,整个事件分发过程便到此结束