Android世界

Android触摸事件分发

2015-10-19  本文已影响141人  陈大集

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(),但是可以在非主线程中调用

上一篇下一篇

猜你喜欢

热点阅读