千家信息网

Android中点击事件分发机制的原理分析

发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章主要介绍了Android中点击事件分发机制的原理分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android中点击事件分发机制的原理分析文章都会有所收获,下面
千家信息网最后更新 2025年02月06日Android中点击事件分发机制的原理分析

这篇文章主要介绍了Android中点击事件分发机制的原理分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android中点击事件分发机制的原理分析文章都会有所收获,下面我们一起来看看吧。

搭建最简单的结构

新建Activity,重写dispatchTouchEvent和onTouchEvent,前面的方法负责点击事件的分发,后面的方法负责点击事件的消耗,然后打印三种触摸事件的触发

private static final String TAG = MainActivity.class.getSimpleName();@Override  public boolean onTouchEvent(MotionEvent event) {    int action = event.getAction();    switch (action) {      case MotionEvent.ACTION_DOWN:        Log.d(TAG, "Activity onTouchEvent ACTION_DOWN");//按下        break;      case MotionEvent.ACTION_MOVE:        Log.d(TAG, "Activity onTouchEvent ACTION_MOVE");//移动        break;      case MotionEvent.ACTION_UP:        Log.d(TAG, "Activity onTouchEvent ACTION_UP");//抬起        break;    }    return super.onTouchEvent(event);  }@Override  public boolean dispatchTouchEvent(MotionEvent ev) {    int action = ev.getAction();    switch (action) {      case MotionEvent.ACTION_DOWN:        Log.d(TAG, "Activity dispatchTouchEvent ACTION_DOWN");        break;      case MotionEvent.ACTION_MOVE:        Log.d(TAG, "Activity dispatchTouchEvent ACTION_MOVE");        break;      case MotionEvent.ACTION_UP:        Log.d(TAG, "Activity dispatchTouchEvent ACTION_UP");        break;    }    return super.dispatchTouchEvent(ev);  }

新建一个类继承自LinearLayout,同样也重写dispatchTouchEvent和onTouchEvent,还有因为LinearLayout继承自ViewGroup,ViewGroup是可以拦截点击事件的,这个很好理解,因为控件都是放在他里面的嘛。所以还要重写onInterceptTouchEvent方法

@Override  public boolean onInterceptTouchEvent(MotionEvent ev) {    int action = ev.getAction();    switch (action) {      case MotionEvent.ACTION_DOWN:        Log.d(TAG, "onInterceptTouchEvent ACTION_DOWN");        break;      case MotionEvent.ACTION_MOVE:        Log.d(TAG, "onInterceptTouchEvent ACTION_MOVE");        break;      case MotionEvent.ACTION_UP:        Log.d(TAG, "onInterceptTouchEvent ACTION_UP");        break;      default:        break;    }    return false;  }

(这里有个重点).

这里有个需要注意的地方就是Android的控件有些是默认可以点击的(如Button),还有一些是默认不可点击的(如TextView)他们的分发是有一些不同的,这里我们先看不可点击的,新建一个类继承android.support.v7.widget.AppCompatTextView,兼容的TextView,同时跟Activity一样重写dispatchTouchEvent和onTouchEvent,代码不贴了,跟上面一样,它是普通控件,没有拦截的方法。

开始点击,移动手指后抬起

然后来点一点屏幕上的控件看看打印的log,dispatchTouchEvent和onTouchEvent都返回默认的实现super,onInterceptTouchEvent默认返回false,表示不拦截,默认的情况打印:

1.--------------------------------------D/MainActivity: Activity dispatchTouchEvent ACTION_DOWND/MyLayout: dispatchTouchEvent ACTION_DOWND/MyLayout: onInterceptTouchEvent ACTION_DOWND/MyTextView: dispatchTouchEvent ACTION_DOWN2.--------------------------------------D/MyTextView: onTouchEvent ACTION_DOWND/MyLayout: onTouchEvent ACTION_DOWND/MainActivity: Activity onTouchEvent ACTION_DOWN3.--------------------------------------D/MainActivity: Activity dispatchTouchEvent ACTION_MOVED/MainActivity: Activity onTouchEvent ACTION_MOVED/MainActivity: Activity dispatchTouchEvent ACTION_MOVED/MainActivity: Activity onTouchEvent ACTION_MOVED/MainActivity: Activity dispatchTouchEvent ACTION_UPD/MainActivity: Activity onTouchEvent ACTION_UP

这是默认的情况,把它分为三个阶段:

1. 事件的分发,从上到下,从Activity到Layout到Text的dispatchTouchEvent结束

2. 事件的消耗,从下到上,从Text到Layout到Activity的onTouchEvent结束

3. 这套动作的后续事件交给上个事件的最后消耗者,不经过其他控件的分发

三个函数的其他返回值

dispatchTouchEvent和onTouchEvent都有三种返回情况
- true
- false
- super.dispatchTouchEvent(ev)和super.onTouchEvent(event)

onInterceptTouchEvent有两种返回,true和false,这样来看, 组合起来真是情况太多了,写下来挨个分析看代码的话怕是要看晕,所以这里用一张图来看看所有的情况:

普通不可点击View的事件分发流程

默认可点击控件的事件分发

比如Button这种默认可以点击的控件,或者设置android:clickable="true"的控件,在分发流程中有一些不同,主要是onTouchEvent的默认方法不同,它直接消耗点击事件,不再往上传递。

可点击View的事件分发流程

关于"Android中点击事件分发机制的原理分析"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Android中点击事件分发机制的原理分析"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

0