【Android学习】View点击事件的分发机制(一)

简介: 版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/51105518 事件分发机制是android中的核心知识点和难点。
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/51105518

事件分发机制是android中的核心知识点和难点。相信很多人也和我一样对于这点感到非常困惑。我看了很多篇博客和书面资料。觉得写得最通俗易懂的就是郭霖的Android事件分发机制完全解析,带你从源码角度彻底理解。任玉刚的《Android开发艺术与探索》3.4 View的事件分发机制。也写的不错,本博客就是主要参考这俩篇的。

一、点击事件的传递规则

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优先级最低,处于事件传递的尾端。


比如说你当前有一个非常简单的项目,只有一个Activity,并且Activity中只有一个按钮。你可能已经知道,如果想要给这个按钮注册一个点击事件,只需要调用:

 
<span style="font-size:18px;">button.setOnClickListener(new OnClickListener() {  
    @Override  
    public void onClick(View v) {  
        Log.d("TAG", "onClick execut");  
    }  
}); 
</span>

<span style="font-size:18px;">button.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View v) {
		Log.d("TAG", "onClick execute");
	}
});</span>

这样在onClick方法里面写实现,就可以在按钮被点击的时候执行。你可能也已经知道,如果想给这个按钮再添加一个touch事件,只需要调用:

<span style="font-size:18px;">button.setOnTouchListener(new OnTouchListener() {
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		Log.d("TAG", "onTouch execute, action " + event.getAction());
		return false;
	}
});</span>

onTouch方法里能做的事情比onClick要多一些,比如判断手指按下、抬起、移动等事件。那么如果我两个事件都注册了,哪一个会先执行呢?我们来试一下就知道了,运行程序点击按钮,打印结果如下:


可以看到,onTouch是优先于onClick执行的,并且onTouch执行了两次,一次是ACTION_DOWN,一次是ACTION_UP(你还可能会有多次ACTION_MOVE的执行,如果你手抖了一下)。因此事件传递的顺序是先经过onTouch,再传递到onClick。

细心的朋友应该可以注意到,onTouch方法是有返回值的,这里我们返回的是false,如果我们尝试把onTouch方法里的返回值改成true,再运行一次,结果如下:


我们发现,onClick方法不再执行了!为什么会这样呢?你可以先理解成onTouch方法返回true就认为这个事件被onTouch消费掉了,因而不会再继续向下传递。

如果到现在为止,以上的所有知识点你都是清楚的,那么说明你对Android事件传递的基本用法应该是掌握了。

3、点击事件递示意图如下所示:

相信大家看了示意图之后,对分发机制的传递有了清楚的认识。后面的几篇博客将从源码的角度解析事件的分发机制。



相关文章
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
103 0
|
3月前
|
Android开发 容器
Android UI设计: 什么是View和ViewGroup?
Android UI设计: 什么是View和ViewGroup?
36 0
|
3月前
|
安全 Linux Android开发
Android安全启动学习(一):AVB校验是什么?
Android安全启动学习(一):AVB校验是什么?
100 0
|
3月前
|
存储 安全 Linux
Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树
Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树
124 0
|
3天前
|
网络协议 Shell Android开发
Android 深入学习ADB调试原理(1)
Android 深入学习ADB调试原理(1)
20 1
|
3月前
|
开发框架 物联网 数据库
89个android学习样例源码
89个android学习样例源码
76 0
|
3月前
|
Java Android开发 C++
2023安卓逆向 -- JNI学习(从开发到反编译)
2023安卓逆向 -- JNI学习(从开发到反编译)
22 0
|
3月前
|
Android开发
Android源码学习(五):AVB2.0-libavb库介绍2
Android源码学习(五):AVB2.0-libavb库介绍2
105 0
|
3月前
|
安全 算法 Android开发
Android安全启动学习(五):Android Verified Boot 2.0
Android安全启动学习(五):Android Verified Boot 2.0
237 0
|
3月前
|
存储 安全 Android开发
Android安全启动学习(三):AVB校验的内容、怎么校验、AVB的作用
Android安全启动学习(三):AVB校验的内容、怎么校验、AVB的作用
159 0