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中点击事件分发机制的原理是什么-创新互联
分享链接:https://www.cdcxhl.com/article14/ddegde.html

成都网站建设公司_创新互联,为您提供企业网站制作软件开发网页设计公司商城网站网站排名微信小程序

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

搜索引擎优化