Android—事件

事件处理:

一、概念:

在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):

  1. View.OnClickListener : onClick() 单击事件
  2. View.OnLongClickListener : onLongClick() 长按事件
  3. View.OnFocusChangeListener : onFocusChange() 焦点改变事件
  4. View.OnKeyListener : onKey() 按键监听事件
  5. View.OnTouchListener : onTouch() 触摸屏事件
  6. 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(),如果遇到特殊情况也是这个流程的子集。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值