安卓面试必问一View的事件分发

 真心面试要准备很多东西,其实我觉得程序员何必难为程序员,有可能面试官,自己都不知道..................但是为了证明你学过安卓,你得答出来不是,在加上面试也同时给你复习基础,如果你看了这篇文章 我觉得你最好用自己的语言组织下,经过大脑组织过得东西,记忆才快。


面试官问:请你讲解一下事件分发是怎么回事?


小菜鸟:那我就用一个小例子讲解下...........

首先:

1.测试优先级结果是 Ontouch>OnClick

我先给一个button 注册一个点击事件(onClick),和一个touch事件(setOnTouchListener) 并且打印输出结果 touch事件判断的比较多 比如按下 抬起,移动事件 。然后我就点击一下button 打印结果是Ontouch事件先执行,然后执行点击事件。 Ontouch事件执行两次,一次是ACTION_DOWN,一次是ACTION_UP 然后事件传递到OnClick中


2.通过改OnTouch返回值 可以把事件传递截止


Ontouch事件是有返回值的,我就尝试把返回值改成true 我发现Onclick 事件并没有执行了, 这是因为onTouch 方法返回true 就认为这个事件被onTouch 消费掉了,因而不会再继续向下传递


3.从源码分析

从源码中,如果我点击任何一个控件,他就一定会调用 dispatchTouchEvent,当我们点击Button的时候,就会调用这个方法,如果button并没有发生,他就会传递给父类textView,如果textView 也没有,那就继续去父类找View里面,如图所示 知道找到那个方法


对于View中的dispatchTouchEvent方法,在这个方法内,首先是进行了一个判断,里面有三个条件,如果这三个条件都满足,就返回true,否则就返回onTouchEvent方法执行的结果。


对于第一个条件是一个mOnTouchListener变量,这个变量是在View中的setOnTouchListener方法里赋值的,也就是说只要我们给控件注册了touch事件,mOnTouchListener就一定被赋值了。

第二个条件是判断当前点击的控件是否是enable的,按钮默认都是enable的,因此这个条件恒定为true。

第三个条件最为关键,mOnTouchListener.onTouch(this, event),其实也就是去回调控件注册touch事件时的onTouch方法。也就是说如果我们在onTouch方法里返回true,就会让这三个条件全部成立,从而整个方法直接返回true。如果我们在onTouch方法里返回false,就会再去执行onTouchEvent(event)方法。 



4.onTouchEvent方法


如果我们的控件是可以点击的,就会进入到switch判断中去,而如果当前的事件是抬起手指,则会进入到MotionEvent.ACTION_UP这个case当中。在经过种种判断之后,会执行到performClick()方法

对于performClick()方法,只要mOnClickListener不是null,就会去调用它的onClick方法

而刚刚说过,当我们通过调用setOnClickListener方法来给控件注册一个点击事件时,就会给mOnClickListener赋值。然后每当控件被点击时,都会在performClick()方法里回调被点击控件的onClick方法。

这样View的整个事件分发的流程就让我们搞清楚了!



5.touch事件分发的三个问题:

1. onTouchonTouchEvent有什么区别,又该如何使用?

从源码中可以看出,这两个方法都是在ViewdispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。

另外需要注意的是,onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点击的控件必须是enable的。因此如果我们有一个控件是非enable的,那么给它注册onTouch事件将永远得不到执行。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值