版权声明:本文为博主原创文章,转载请注明出处https://www.jianshu.com/p/2b2a4ea8446d
前言
与网上其它诸多此类的文章不同,我希望能以最简洁的方式描述清楚整个过程,而最简洁的方式是什么呢?没错,就是代码!简洁的代码!所以我从源码中把涉及到事件分发部分的代码都抽取出来,精简掉无用的,只保留平时常见的部分,一眼就能看明白的那种。
概述
Android的事件分发流程分为两个部分,View的事件分发和ViewGroup事件分发,这篇先讲View的事件分发。View的事件分发主要涉及到两个相关函数 dispatchTouchEvent
和 onTouchEvent
。事件分发顺序从前者到后者。
代码
代码基于API27(Android 8.1)SDK源码精简而来
dispatchTouchEvent
public boolean dispatchTouchEvent(MotionEvent event) {
boolean result = false;
// touchListener就是通过setOnTouchListener设置的监听器
if (touchListener != null
&& isEnabled()
&& touchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
return result;
}
onTouchEvent
public boolean onTouchEvent(MotionEvent event) {
// click, longClick, contextClick任意被设置一个,该值就为true
// clickable, longClickable, contextClickable任意一个为true,该值就为true
boolean mClickable = false;
if (!isEnabled()) {
return mClickable
}
// mTouchDelegate为通过setTouchDelegate设置的代理
if (mTouchDelegate != null) {
if (mTouchDelegate.onTouchEvent(event)) {
return true;
}
}
if (mClickable) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
// onClick就是通过setOnClickListener注册的监听器
onClick(this);
break;
default:
break;
}
return true;
}
return false;
}
总结
View的分发还是很简单的,下一篇说ViewGroup