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 XML解析技术
- Android中的Context
- 【自动化测试】Android(安卓)Monkey实践
- 更简单的学习Android事件分发
- 【Android】实现XML解析的几种技术
- Android中的Context
- Handler Looper源码解析(Android消息传递机制)
- Android中解析XML
- Android桌面小部件AppWidget(1)