真心面试要准备很多东西,其实我觉得程序员何必难为程序员,有可能面试官,自己都不知道..................但是为了证明你学过安卓,你得答出来不是,在加上面试也同时给你复习基础,如果你看了这篇文章 我觉得你最好用自己的语言组织下,经过大脑组织过得东西,记忆才快。
面试官问:请你讲解一下事件分发是怎么回事?
小菜鸟:那我就用一个小例子讲解下...........
首先:
1.测试优先级结果是 Ontouch>OnClick
2.通过改OnTouch返回值 可以把事件传递截止
3.从源码分析
对于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. onTouch和onTouchEvent有什么区别,又该如何使用?
从源码中可以看出,这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。
另外需要注意的是,onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点击的控件必须是enable的。因此如果我们有一个控件是非enable的,那么给它注册onTouch事件将永远得不到执行。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。