Android中手势事件的分发流程

在手机上,我们都是通过对屏幕的触摸实现软件的操作,那么这些各种的触摸事件就存在一个嵌套分发的过程,这里我们说说手势分发的相关知识。

1.3类手势执行方法

  • dispatchTouchEvent:进行事件分发处理,返回结果表示该事件是否需要分发。默认返回true表示分发给下级视图,由下级视图处理该手势,不过最终是否分发成功还得根据onInterceptTouchEvent方法的拦截判断结果;返回false表示不分发,此时必须实现自身的onTouchEvent方法,否则该手势将不会得到处理
  • onInterceptTouchEvent:进行事件拦截处理,返回结果表示当前容器是否需要拦截该事件。返回true表示予以拦截,该手势不会分发给下级视图,此时必须实现自身的onTouchEvent方法,否则该手势将不会得到处理默认返回false表示不拦截,该手势会分发给下级视图进行后续处理。
  • onTouchEvent:进行事件触摸处理,返回结果表示该事件是否处理完毕。返回true表示处理完毕,无须处理上级视图的onTouchEvent方法,一路返回结束流程;返回false表示该手势事件尚未完成,返回继续处理上级视图的onTouchEvent方法,然后根据上级onTouchEvent方法的返回值判断直接结束或由上级处理。

2.手势执行者

  • 页面类:包括Activity及其派生类。页面类可操作dispatchTouchEvent和onTouchEvent两种方法。
  • 容器类:包括从ViewGroup类派生出的各类容器,如各种布局Layout,以及ListView、GridView、Spinner、ViewPager、RecyclerVIew、Toolbar等。容器类可操作dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三种方法。
  • 控件类:包括从View类派生的各类控件,如TextView、ImageView、Button等。控件类可操作dispatchTouchEvent和onTouchEvent两种方法。

3.注意

只有容器才能操作onInterceptTouchEvent方法,这是因为该方法用于拦截发往下层视图的事件,而控件类已经位于底层,只能被拦截,不能拦截别人页面类不拥有下层视图,所以不能操作onInterceptTouchEvent方法。

4.手势处理组合规则

  • 首先是页面类的手势处理,其dispatchTouchEvent必须返回true,因为如果不分发,页面上的视图就无法处理手势。至于页面类的onTouchEvent,基本没什么作用,因为手势动作由具体视图处理,页面直接处理手势没什么意义。所以页面类的手势处理可以不用关心,直接略过。
  • 其次是控件类的手势处理,其dispatchTouchEvent没有任何作用,因为控件下面没有下级视图,无所谓分不分发。至于控件类的onTouchEvent,如果要进行手势处理,就需要自定义一个控件,重写自定义类中的onTouchEvent方法;如果不想自定义控件,就直接调用控件对象的setOnTouchListener方法,注册一个触摸监听器OnTouchListener,并实现该监听器的onTouch方法。所以控件类的手势处理只需关心onTouchEvent方法。
  • 最后是容器类的手势处理,这才是真正要深入了解的地方。容器类的dispatchTouchEvent与onInterceptTouchEvent两个方法都能决定是否将手势交给下级视图处理。为了避免手势响应冲突,一般要重写dispatchTouchEvent方法或onInterceptTouchEvent方法。这两个方法之间的区别可以这么理解:前者是大领导,只管派发任务,不会自己做事情;后者是小领导,尽管有拦截的权利,不过也得自己做点事情,比如处理纠纷。容器类的onTouchEvent近乎摆设,因为需要拦截的在前面已经拦截了,需要处理的在下级视图已经处理了,很少会兜一大圈在这儿处理。

5.常见的手势处理方法

  • 容器类的dispatchTouchEvent方法:控制事件的分发,决定把手势交给谁处理。
  • 容器类的onInterceptTouchEvent方法:控制事件的拦截,决定是否要把手势交给下级视图处理。
  • 控件类的onTouchEvent方法:进行手势事件的具体处理。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值