【Android】针对面试的事件分发

对于2019年的面试,事件分发会被面试官经常提及,大部分都是对view层级的处理。对于底层我是不大了解啦,只能简单的总结一下到底事件分发是干什么哒……

首先为什么使用?
主要是android上的View是树形结构,View可能会有重叠,在我们点击的时候,如何做到正确响应的view,处理这种情况,我们就需要用到事件分发。

应用场景?
根据对象 :activity—viewgroup—view,这三个部分构成,到底分配给谁是个问题。主要是确定谁来干,不干就传递下一级,没有更低,就上传为上一级。直到有人消费为止。

事件分发的三个主要对象:
在这里插入图片描述
然后是三个经常用到的重要的方法:
在这里插入图片描述
综上可以看出?
activity和view是没有onInterceptTouchEvent() 也就是事件拦截这个方法,主要原因也是比较简单的,只要是首先activity作为最顶端的对象,如果一开始就拦截了,那就会导致整个屏幕无法响应操作,里面的操作就失去作用了。 再来,处于最低端的view,它已经是最底端啦,如果可以处理就处理,不可以就返回上一级,不需要存在拦截这个方法,如果传递到最上一级,仍然没有人处理。那么这个事件就会被销毁。

然后我们来了解一些事件分发的流程文字+图

事件分发的过程?
总结:就是当我们执行这个操作后,当我们点击屏幕后,首先是activity接受到任务,调用方法dispatchTouchEvent,将事件分发给phonewindow,调用superDispatchTouchEvent,然后在调用里面的内部方法decorView的dispatchTouchEvent,然后DecorView又会调用dispatchTouchEvent去进行事件分发,如果不拦截,默认false,就会继续下传到rootview,操作一样,同样再distpatch内部调用OnIntercepter去判断是否拦截,不拦截就分发给viewgroup,viewgroup里面有内部方法拦截事件,通过返回的true或者false,来判断是否要拦截,或者是分发。最底层view,没有拦截事件,true就是onTouchEvent自己进行消费,false就根据上面的顺序执行,如果长传到最顶层仍然没有人消费,事件最终会被销毁。

图如下:
在这里插入图片描述
Android事件分发机制总结:
1、Android中的控件都是直接或者间接继承View的,Viewgroup也是继承View的,ViewGroup中可以包含View,也可以包含ViewGroup,我们平时接触的譬如说LinearLayout啊、RelativeLayout就是ViewGroup的子类。

2、Android的事件分发机制的源码,大概就是Android中触摸事件的传递都是先传递到ViewGroup,再传递到View的。就举Button点击这个例子来讲解一下Android中触摸事件分发的大致流程吧。

当点击Button的时候,会调用这个控件所在布局的dispatchTouchEvent(),然后在这个布局中dispatchTouchEvent()方法中找到被点击控件的dispatchTouchEvent()方法。在调用被点击控件的dispatchTouchEvent()方法之前会有一次触摸事件的拦截判断,如果触摸事件被拦截了,就不会再去执行被点击控件的dispatchTouchEvent函数了,也就不会再执行onClick点击事件了。而是执行ViewGroup控件中的dispatchTouchEvent()的onTouch触摸事件然后返回。

3、android里面当触摸到任何一个控件的时候就一定会调用这个控件的dispatchTouchEvent方法。dispatchTouchEvent方法中的源码首先会调用onTouch方法,不过这个方法要执行的话也需要有两个前提条件,一个是这个控件注册了触摸监听、第二个是这个控件的状态要是enabled的。
执行完onTouch方法之后,会有一个返回值,如果返回这为true的话代表要自身消费,为false的话就表示点击事件继续往下面的view传递,就会执行onTouchEvent方法,onClick方法就是在onTouchEvent中被调用的。

备注:借鉴于https://blog.csdn.net/pgg_cold/article/details/79472193,感谢。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值