安卓触摸事件剖析

本文主要对onTouch以及事件的处理消费进行剖析。

       onTouch是安卓系统中整个事件机制的基础。安卓系统中的其他事件,如onClick、onLongClick等都是以onTouch为基础的。

       onTouch包括从手指按下到离开手机屏幕的整个过程,在微观形式上,具体表现为Action_down、Action_move和Action_up等过程。

onTouch两种主要定义形式如下:

1在自定义控件中,常见的有重写onTouchEvent()方法。如在开发中经常可以看到重写的onTouchEvent方法,

并且其中有针对不同的微观表现(action_down、action_move和action_up等)做出的相应判断,执行逻辑并可能返回不同的布尔值。

(这里解释一下重写onTouchEvent方法和setOnTouchListener监听的区别:

一、如果setOnTouchListener中的onTouch方法返回值是true(事件被消费)时,则onTouchEvent方法将不会被执行;
二、只有当setOnTouchListener中的onTouch方法返回值是false(事件未被消费,向下传递)时,onTouchEvent方法才被执行。
三、以上说的情况适用于View对象(事件会最先被最内层的View对象先响应)而不是ViewGroup对象(事件会最先被最外层的View对象先响应)。
综合来讲:
onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。
假如onTouch方法返回false,会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。
内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发

2.在代码中,直接对现有控件设置setOnTouchListener监听器。并重写监听器的onTouch方法。onTouch回调函数中有view和MotionEvent

参数,据此也可以针对不同的事件微观表现作出不同的处理。

需要注意的是:整体上,事件的微观表现遵循”事件传递和消费“一文,但是针对于action_down,需要有如下注意的地方:

1.在所有的事件微观表现中,Action_down是整个事件的基础,是任何宏观事件的起始事件,一旦Action_down return false,表示事件继续向外层冒泡,当有某一层的Action_down

中return true,表示此层消费了此Action_down事件,那么在接下里的action_move、action_up等事件中,将直接先传入此层中,且不管Action_move、

Action_up等返回false还是true,事件都不会继续冒泡到外层。事件由此被消费掉。

2.由此可以得知,Action_down在整个事件传递中的重要作用。如果某层发生了action_move或者action_up微观事件,那么一定发发生过action_down微观事件。

 

关于setOnTouchListener、setOnClickListener和setOnLongClickListener:

Android中,有时候经常见到针对同一控件可能设置不同的事件监听器(如setOnTouchListener、setOnClickListener和setOnLongClickListener),对于这些事件监听器的执行顺序,

setOnTouchListener是最先执行的。并且只有当此空间完整走完action_down和action_up流程后,才可能调用performClick()方法,及调用onclick执行。而onLongClick则是在action_down

之后开始,并且是在一个新的线程中去判断按压的时间,条件满足则调用performLongClick()函数,及调用onLongClick()函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值