android 触摸事件的分发,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。

5fb4f41c222acd1600869039f469ab69.png

触摸事件分发

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值