Android触摸事件分发
Android系统中 ViewGroup的子类都具有
//用来分发TouchEvent
public boolean dispatchTouchEvent(MotionEvent ev)
//用来拦截TouchEvent
public boolean onInterceptTouchEvent(MotionEvent ev)
//用来处理TouchEvent
public boolean onTouchEvent(MotionEvent ev)
不是所有的View的子类都需要分发触摸事件,只有可以往里面添加View控件的才可以。
比如TextView已经是最小的View了,无需进行事件分发,只进行事件处理,所以它没有dispatchTouchEvent和onInterceptTouchEvent,只有onTouchEvent。
dispatchTouchEvent
仅进行事件的分发、判断和过滤,会在此方法中的不同时机调用o
onInterceptTouchEvent和onTouchEvent.ß
onInterceptTouchEvent
实现这个方法以拦截所有窗口点击事件
来根据事件的不同对子控件或自身分发事件,覆盖这个方法时需要注意,它与onTouchEvent有着复杂的关系。
发生MotionEvent.ACTION_DOWN
->false
后续的Move和Up事件会先传到此ViewGroup,之后才合Down时间一样传递给最终目标(的onTouchEvent处理)。
->true
后续Move和Up事件不会传给其它ViewGroup,直接和Down时间一起传递给此ViewGroup的onTouchEvent处理,子View接收不到任何事件。
如果最终目标view的onTouchEvent返回了
->false
,表示事件并没有被消耗,该事件会被传递到上一层次的View的onTouchEvent进行处理。
->true
,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
1
onInterceptTouchEvent是在ViewGroup里面定义的
2
Android中的layout布局类一般都是继承此类的
3
onInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterceptTouchEvent
onTouchEvent
发生MotionEvent.ACTION_DOWN
->false
不再处理之后的MOVE和UP事件
当我们手指点击屏幕时候,先调用ACTION_DOWN事件,当onTouch里返回值是true的时 候,onTouch回继续调用ACTION_UP事件,如果onTouch里返回值是false,那么onTouch只会调用ACTION_DOWN而不 调用ACTION_UP.
常用事件列表
ACTION_DOWN
ACTION_MOVE
ACTION_UP
ACTION_CANCEL
//默认值
1.ViewGroup里的onInterceptTouchEvent默认值是false这样才能把事件传给View里的onTouchEvent.
2.ViewGroup里的onTouchEvent默认值是false.
3.View里的onTouchEvent返回默认值是true.这样才能执行多次touch事件.
View.bringToFront()
ViewGroup通过一个Array保存子View,bringToFront是将子View放在Array的最后,ViewGroup的dispatchDraw是按照从前往后遍历Array调用drawChild的,所以最后的子View就会显示在最前面。
View.invalidate()
刷新View,必须在UI线程中调用
把之前旧的view从主UI线程队列中pop掉
View.postInvalidate()
同View.invalidate(),但是可以在非主线程中调用