Android事件机制

来源:互联网 发布:第九届杭州网络文化节 编辑:程序博客网 时间:2024/06/06 20:04

Touch事件相关的方法

         dispatchTouchEvent(MotionEventev)、

         onInterceptTouchEvent(MotionEventev)、

         onTouchEvent(MotionEventev);

 

方法与Activity、View对应关系

Touch事件                                                           函数功能    View   ViewGroup  Activity

dispatchTouchEvent(MotionEvent ev)           事件分发    Yes     Yes             Yes

onInterceptTouchEvent(MotionEvent ev)      事件拦截     No     Yes              No

onTouchEvent(MotionEvent ev)                      事件响应    Yes     Yes             Yes

 

一个简单而完整的Touch事件的Event,是由ACTION_DOWN开始。

ACTIOM_UP结束。

可能有多个或没有ACTION_MOVE事件。

 

屏幕发生Touch事件,并将事件传递到Activity后

  1. Activity 的 dispatchTouchEvent方法会从View的最底层依次往上层传递;
  2. 传递过程根据dispatchTouchEvent的返回值判断是否继续传递;
  3. 传递过程可以将事件拦截不再继续传递,而在当前窗口进行消费;
  4. 事件分发后由onTouchEvent进行处理(消费);
  5. 消费过程根据onTouchEvent的返回值判断是否被消费(处理完成、结束);

 

传递过程: 根据dispatchTouchEvent的返回值判断是否继续传递。

规则是:

         默认returnsuper.dispatchTouchEvent(ev),事件传递给

                            当前 View 的 onInterceptTouchEvent方法。

         returntrue,事件停止传递;

         returnfalse,事件返回给其上层View的  onTouchEvent;

传递过程: 可以根据onInterceptTouchEvent的返回值将事件拦截不再继续传递,而在当前窗口进行消费

规则是:

         returntrue,将事件拦截,分发给当前View的onTouchEvent 进行处理。

         returnfalse,将事件放行,传递给下一层View,如果是最外层View则,

                            分发给当前View的onTouchEvent进行处理。

         默认returnsuper.onInterceptTouchEvent(ev)的值是false;

消费过程: 根据onTouchEvent的返回值判断是否被消费(处理完成、结束)

规则是:

         returntrue,处理完成。

         returnfalse,没有处理完成,继续传递下去。

         默认return super.onTouchEvent 根据是否为容器类有所不同;

 

事件传递流程

Activity                              RelativeLayout                     LinearLayout

dispatchTouchEvent     dispatchTouchEvent

                                          onInterceptTouchEvent       dispatchTouchEvent

                                                                                           onInterceptTouchEvent

onTouchEvent                onTouchEvent                       onTouchEvent


1.      当TouchEvent发生时,首先在Activity层处理,传递由Activity的 dispatchTouchEvent方法进行分发,如果dispatchTouchEvent返回true,则交给这个Activity的onTouchEvent处理,如果dispatchTouchEvent返回 false,则交给这个 ViewGroup处理。

2.      ViewGroup首先由dispatchTouchEvent方法进行分发,和Activity不同的是如果dispatchTouchEvent返回 false,则传递给interceptTouchEvent方法来决定是否要拦截这个事件,
如果 interceptTouchEvent返回 true,也就是拦截掉了,则交给它的onTouchEvent来处理,
如果 interceptTouchEvent返回 false,那么就传递给子 view,由子 view 的dispatchTouchEvent再来开始这个事件的分发。

在view层,如果事件传递onTouchEvent上了,这个方法返回了 false,那么这个事件会从这个 view往上传递,都是onTouchEvent来接收,直到事件被处理。

 

事件处理的三个方法

·        dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,然后决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。

·        onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。

·        onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,因为ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的(iOS可以)。

 


0 0