android点击事件的优先级,View的事件分发机制从dispatchTouchEvent说起

bVbFlf2

事件分发机制是android中的核心知识点和难点。相信很多人也和我一样对于这点感到非常困惑。我看了很多篇博客和书面资料。今天我们就聊聊事件的分发机制。

一、点击事件的传递规则

1、什么是点击事件(MotionEvent)

在了解点击事件的传递规则之前,我们首先要弄明白什么事点击事件(MotionEvent),所谓MotionEvent是指手指接触屏幕后所产生的一系列事件。

ACTION_DOWN————手指刚接触屏幕。

ACTION_MOVE————手指在屏幕上移动。

ACYION_UP————手指从屏幕上松开的一瞬间。

2、点击事件分发过程

点击事件的分发过程就是MotionEvent的分发过程,该过程主要由以下三个函数来完成:

public boolean dispatchTouchEvent(MotionEvent ev)

功能:用来进行事件的分发

public boolean onInterceptTouchEvent(MotionEvent ev)

功能:用来判断是否拦截某个事件。

public boolean onTouchEvent(MotionEvent ev)

功能:处理点击事件,在dispatchTouchEvent中调用。返回结果表示是否消耗当前点击事件。

先不急我们从最简单的OnClickListener来看,OnClickListener的优先级最低,处于事件传递的尾端。

我们首先简单创建一个Android 项目,只有一个 Activity ,并且 Activity 中有一个按钮。如果我们想要给这个按钮注册一个点击事件,只需要调用如下的代码:

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Log.e("TAG_紫雾凌寒","执行了onClick");

}

});

这样在onClick()方法里面写我们需要处理的业务逻辑,就可以在按钮被点击的时候执行。再如果想给这个按钮再添加一个 touch 事件,只需要调用如下所示的代码:

button.setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

Log.e("TAG_紫雾凌寒","执行了onTouch==Action="+event.getAction());

return false;

}

});

我们仅仅凭 Touch[触摸] 和 Click[点击] 就能够猜想到onTouch()方法里能做的事情比onClick()要多一些,比如判断手指按下、抬起、移动等事件。那么我同时给 button 两个事件都注册了,哪一个会先执行呢?我们用事实说话,运行程序点击按钮,我们会发现打印结果如下:

bVbFlf1

这里我们可以看到,onTouch()是优先于onClick()执行的,并且根据日志可以看到onTouch()执行了两次,一次是 ACTION_DOWN ,一次是 ACTION_UP (当你手指按下屏幕并在屏幕上滑动时,还会有多次 ACTION_MOVE 的执行)。因此事件传递的顺序是先经过onTouch(),再传递到onClick()。

有些同学可能已经注意到,onTouch()方法是有返回值的,这里我们返回的是 false 。如果我们尝试把onTouch()方法里的返回值改成 true ,再运行一次,结果如下:

bVbFlfX

我们发现,onClick()方法不再执行了!那为什么会这样呢?具体的原因看完这篇文章大家就明白了,这里我们可以先理解成onTouch()方法返回 true 就认为这个事件被onTouch

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值