温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-04-11 15:52:10 来源:亿速云 阅读:278 作者:iii 栏目:编程语言

这篇文章主要介绍了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_DOWN
D/MyLayout: dispatchTouchEvent ACTION_DOWN
D/MyLayout: onInterceptTouchEvent ACTION_DOWN
D/MyTextView: dispatchTouchEvent ACTION_DOWN
2.--------------------------------------
D/MyTextView: onTouchEvent ACTION_DOWN
D/MyLayout: onTouchEvent ACTION_DOWN
D/MainActivity: Activity onTouchEvent ACTION_DOWN
3.--------------------------------------
D/MainActivity: Activity dispatchTouchEvent ACTION_MOVE
D/MainActivity: Activity onTouchEvent ACTION_MOVE
D/MainActivity: Activity dispatchTouchEvent ACTION_MOVE
D/MainActivity: Activity onTouchEvent ACTION_MOVE
D/MainActivity: Activity dispatchTouchEvent ACTION_UP
D/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的事件分发流程

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

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

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

可点击View的事件分发流程

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

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI