android 事件传递

Android事件传递属于老生长谈的知识点,很多人知道其中的原理,可真的要表述出来还是有些遗漏。自己也曾复习过这些,没有留下书面记录,时间长了就忘了,所以记录下。

 

1. 事件传递对象:window activity viewGroup view;

2. 事件分发的原理:

1首先由Activity分发,分发给根View,也就是DecorViewDecorView为整个Window界面的最顶层View

2然后由根View分发到子的View

 

3. 事件分发流程:

 

 activity从父类拿到事件后,默认会按照以下流程进行事件传递:

 

 

 

整个事件流向从Activity---->ViewGroup--->View 从上往下调用dispatchTouchEvent方法,一直到叶子节点(View)的时候,再由View--->ViewGroup--->Activity从下往上调用onTouchEvent方法。

 

  View中如果将传递的事件消费掉,父类的ViewGroup中将无法接收到任何事件该事件的传递流程如下图:


4. 事件分发的几个处理方法:

ViewGroup的事件传递方法:

dispatchTouchEvent

onInterceptTouchEvent

onTouchEvent

View的事件传递方法:

View的dispatchTouchEvent

View的onTouchEvent

 

dispatchTouchEvent 作用:

 

首先看下ViewGroup 的dispatchTouchEvent,return true是终结传递。return false 是回溯到父View的onTouchEvent,然后ViewGroup怎样通过dispatchTouchEvent方法能把事件分发到自己的onTouchEvent处理呢,return true和false 都不行,那么只能通过Interceptor把事件拦截下来给自己的onTouchEvent,所以ViewGroup dispatchTouchEvent方法的super默认实现就是去调用onInterceptTouchEvent,记住这一点。
那么对于View的dispatchTouchEvent return super.dispatchTouchEvent()的时候呢事件会传到哪里呢,很遗憾View没有拦截器。但是同样的道理return true是终结。return false 是回溯会父类的onTouchEvent,怎样把事件分发给自己的onTouchEvent 处理呢,那只能return super.dispatchTouchEvent,View类的dispatchTouchEvent()方法默认实现就是能帮你调用View自己的onTouchEvent方法的。

 

onInterceptTouchEvent作用:

 

Intercept 的意思就拦截,每个ViewGroup每次在做分发的时候,问一问拦截器要不要拦截(也就是问问自己这个事件要不要自己来处理)如果要自己处理那就在onInterceptTouchEvent方法中 return true就会交给自己的onTouchEvent的处理,如果不拦截就是继续往子控件往下传。

默认是不会去拦截的,因为子View也需要这个事件,所以onInterceptTouchEvent拦截器return super.onInterceptTouchEvent()和return false是一样的,是不会拦截的,事件会继续往子View的dispatchTouchEvent传递。

 

onTouchEvent作用:

做事件处理

1、自己消费掉,事件终结,不再传给谁----->return true;
2、继续从下往上传,不消费事件,让父View也能收到到这个事件----->return false;View的默认实现是不消费的。所以super==false。

 

5. 注意down 事件跟move up 的传递不太一样

(1)一切事件处理的开始都是从Down事件开始的,如何你处理了Down事件,其他的事件就都收不到了。

(2)onTouch事件、onLongClick事件、onClick事件默认是同时执行:(执行的先后顺序:onTouch > onLongClick > onClick



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章