Android事件分发机制浅析
Posted yian_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android事件分发机制浅析相关的知识,希望对你有一定的参考价值。
有段时间没有写博客了,以前总是感觉对android中的事件传递机制有着相对模糊的理解,今天抽空静心详细看了看。:
- 前言
- 主要方法
- 流程详解
前文
总觉得知识必要要总结,不然就算再熟悉的东西,一段时间不接触就容易遗忘。
Android中的触摸事件传递机制最重要的是是dispatchTouchEvent(),onInterceptTouchEvent()以及onTouchEvent()方法。
touch事件首先会传递到Activity,然后传递到ViewGroup,再到具体的View.主要方法
dispatchTouchEvent():处理事件的分发,事件多数情况下是由Activity的dispatchTouchEvent开始。
onInterceptTouchEvent():处理事件的拦截,由ViewGroup()提供,意味着在activity中你不能够重写此方法。
onTouchEvent():触摸事件的处理。
流程详解
1,Touch事件的传入
开始会由Activity接收事件,接下来事件会传递至Activity的dispatchTouchEvent(),这里默认情况下会是调用
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
return super.dispatchTouchEvent(ev);
查看父类的super.dispatchTouchEvent:
/**
* Called to process a key shortcut event.
* You can override this to intercept all key shortcut events before they are
* dispatched to the window. Be sure to call this implementation for key shortcut
* events that should be handled normally.
* @return True if this event was consumed.
*/
public boolean dispatchTouchEvent(MotionEvent ev)
if (ev.getAction() == MotionEvent.ACTION_DOWN)
onUserInteraction();
if (getWindow().superDispatchTouchEvent(ev))
return true;
return onTouchEvent(ev);
这里判断条件第一个方法是个空方法,第二个判断条件是系统默认的事件分发机制。所以在activity中,如果手动修改dispatchTouchEvent的返回值,那么事件就会被消费,不在往里传递。
2,从Activity传入外层的ViewGroup
经历了Activity传入事件,第一个走的还是dispatchTouchEvent(),如果手动修改了返回值,事件到此终止,如果使用父类的super.dispatchTouchEvent,那么事件就会传递至onInterceptTouchEvent(),
- 在onInterceptTouchEvent中,:是否拦截本次事件传递
1, return true :那么事件会传递至viewGroup的onTouchEvent中。在 onTouchEvent中,
:return true 事件被消费
:return false 表示viewGroup当中的子控件都不想消费,那么它会直接把本次事件往回传,传至activity中去处理。
2,return false: 表示ViewGroup不想拦截,那么事件会继续下发至View
3,事件传递至ViewChild中
dipatchTouchEvent:还是和上面的一样,还是决定是否分发事件,系统的逻辑会自动运行到自己onTouchEvent方法中,如果你主动干预,决定是否分发(手动更改返回值),事件到这里就会终结.
onTouchevent:逻辑和之前的一样,问你是否消费本次事件,
return true :表示消费本次事件,事件结束
return false:表示不消费本次事件,事件会回传给外一层控件,
return super.onTouchEvent(event):是否消费本次事件就要看自己控件类型了(Text,Buttond等,是否消费跟类型有关)
以上是关于Android事件分发机制浅析的主要内容,如果未能解决你的问题,请参考以下文章