今天看了一篇文章关于android事件分发机制的,以前对安卓的事件分发机制一直处于模糊状态,今天看了文章后加上自己写了一点点有了点灵感,所以记下来方便以后在开发的过程中温故而知新。
先介绍View的事件:
android中的基础控件是view,其他的组件无非是继承自view,先把事件分发机制最重要的一句话写在前面,就是所有的组件只要被点击就会出发其中的dispatchTouchEvent方法,但是这个方法并不是每个组件都有的方法,例如像button里没有这个方法,再进入button的父类textview中去找,但是也找不到这个方法,到这里大家不要担心,我们再进入这个textview的父类view中,在这里我们就找到了,方法的源码是这样的:
- public boolean dispatchTouchEvent(MotionEvent event) {
- if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
- mOnTouchListener.onTouch(this, event)) {
- return true;
- }
- return onTouchEvent(event);
- }
- button.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- Log.d("TAG", "onTouch execute, action " + event.getAction());
- return false;
- }
- });
viewGroup事件的分发:
大家都知道viewGroup就是一个包含了多个view的一个容器也可以说是一个布局,但是都继承自view所以viewGroup里面也有dispatchTouchEvent方法,这个方法也是用来执行像view那样的单个组件的事件操作,但是这个不同的是你点击事件先传给view,view再传给viewGroup先执行onInterceptTouchEvent方法,
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- return true;
- }
总之:当你点击了某个控件,首先会去调用该控件所在布局的dispatchTouchEvent方法,然后在布局的dispatchTouchEvent方法中找到被点击的相应控件,再去调用该控件的dispatchTouchEvent方法。假如MyLayout继承自LinearLayout如果我们点击了MyLayout中的按钮,会先去调用MyLayout的dispatchTouchEvent方法,可是你会发现MyLayout中并没有这个方法。那就再到它的父类LinearLayout中找一找,发现也没有这个方法。那只好继续再找LinearLayout的父类ViewGroup,你终于在ViewGroup中看到了这个方法,按钮的dispatchTouchEvent方法就是在这里调用的。
基本思路就是这样,如果我将不详细可以参看一下这篇文章http://sc.qq.com/fx/u?r=SORKRmA