事件处理:
一、概念:
在Android中,我们可以通过事件处理使UI与用户互动(UI Events)。具体形式则是以事件监听器(event listener)的方式來“监听”用户的动作。
Android提供了非常良好的UI事件处理机制。View是绘制UI的类,每个View对象都可以向Android注册一个事件监听器。每个事件监听器都包含一个回调方法(callback method),这个回调方法(callback method)主要的工作就是回应或处理用户的操作。
二、Android UI事件处理的两套机制:
1、基于监听和回调的事件处理机制(event listener):
就是为Android中的控件绑定特定的事件监听器。一旦该控件监听到有相应的动作发生,则该动作会触发事件监听器,而该监听器会调用内部的回调方法做出相应的响应。事件监听器的核心就是它内部包含的回调方法。
2、另外一种UI事件的机制为事件处理器(event handler):event handler与event listener是不一样的处理机制。比如多线程的Handler、Looper消息传递机制。
三、Android种常用的事件监听器及其回调方法(callback method):
- View.OnClickListener : onClick() 单击事件
- View.OnLongClickListener : onLongClick() 长按事件
- View.OnFocusChangeListener : onFocusChange() 焦点改变事件
- View.OnKeyListener : onKey() 按键监听事件
- View.OnTouchListener : onTouch() 触摸屏事件
- View.OnCreateContextMenuListener : onCreateContextMenu() 创建上下文菜单事件
事件分发机制:
1.捕获(从上而下的一个过程)
2.冒泡(从下而上的过程)
以上的流程只是 ACTION_DOWN的一种特殊情况,整个touch事件没有对view进行消费
那么如果存在对事件感兴趣的view的情况下,事件分发机制会是怎么样的呢?
如果view的dispatchTouchEvent返回true,那么就表示view对这个事件感兴趣,那么事件就会被交到view处处理。
ViewGroup对事件进行拦截:
down:
move up:
viewGroup的onInterceptTouchEvent()方法会返回一个true,它的onTouchEvent()也一定是返回true。给view分发一个cancel事件,view接到这个事件之后会进行资源释放,复位等操作。
主要的方法的解析:
dispatchTouchEvent:
ACTION_DOWN的时候:逆序遍历子view,找出对该事件感兴趣的view,标记为targetview,然后对该手势(DOWN-MOVE*-UP)的后续事件都传给targetView。
onInterceptTouchEvent
在ACTION_DOWN,或存在targetView的情况下,可以随时对时间进行拦截,交给自己处理。
onTouchEvent:
拿到事件后针对当前View的相关操作。
自定义View中的事件分发:
处理Touch事件:
- 编写setOnTouchListener(无需继承View)
- 复写onTouchEvent
- 标明对事件感兴趣:
- 如果需要自己获取touch事件进行处理,ACTION_DOWN必须返回true,保证整个手势的事件都能传递到该View。
自定义ViewGroup中的事件分发:
包含上面view的所有事项
拦截子view:
- 可以在onInterceptTouchEvent()子View的事件进行拦截,交给自己的onTouchEvent进行处理。
- 注意:子view会收到来自viewGroup的ACTION_CANCEL,让子view明白后续的事件不会到来了。
总结:事件分发机制基本上是事件流向先Activity——>ViewGroup——>View从上往下依次调用dispatchTouchEvent( ),再从View——>ViewGroup—>Activity从下往上依次调用onTouchEvent(),如果遇到特殊情况也是这个流程的子集。