android的触摸机制

来源:互联网 发布:淘宝双十二承接页装修 编辑:程序博客网 时间:2024/05/29 10:07


dispatchTouchEvent  顾名思义 调用super.dispatchTouchEvent进行touch分发,从activity---->viewGroup--->view   层层分发,

  返回true:事件分发完毕,不再分发,子布局、自己的onTouchEvent 也不会执行,之后action会继续出触发dispatchTouchEvent  方法

返回false:没有分发出去,之后action会不会进行

onTouchEvent            touch事件的处理               从view--->viewGroup--->activity     层层回调 处理onTouchEvent。是回调方法啊,

返回true:消费掉事件,不再向父控件回调onTouchEvent,dispatchTouchEvent  返回true,接受之后的action

       返回false:向父控件回调onTouchEvent,不接受之后的action,例如up,所以onclickListener不会触发



onTouchlistener      参见源码可知,代码在dispatchTouchEvent 中执行,返回true:不会执行onTouchEvent ,

onLongClickListener   当长按的时候,无需到up就会触发onLongClick的响应,但之后也会继续触发onClick的响应,但如果在onLongClick中返回true,则流程如下,即只在中间触发了onLongClick,之后会继续响应touch,但当up的时候就不会再触发onClick

onClickListener      参见源码可知,onClick的触发是在onTouchEvent回调中来实现的,把onTouchEvent回调中的super.onTouchEvent去除,直接返回true,则onClick不会执行。


setEnable     总开关,true:控件处于活动状态。

    false:永远不活动,不能onclick,因为onclick事件在onTouch中的ACTION_UP执行,如果disable,则return,不会放下执行。

if ((viewFlags & ENABLED_MASK) == DISABLED) {            if (event.getAction() == MotionEvent.ACTION_UP && (mPrivateFlags & PFLAG_PRESSED) != 0) {                setPressed(false);            }            // A disabled view that is clickable still consumes the touch            // events, it just doesn't respond to them.            return (((viewFlags & CLICKABLE) == CLICKABLE ||                    (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));        }

setOnclick   CLICKABLE 决定onTouchEvent 返回值。

     CLICKABLE ==true,事件被消费,onTouchEvent返回      true

     CLICKABLE ==false,事件未被消费,onTouchEvent返回  false


综合得出Android View的触摸屏事件传递机制有如下特征:

  1. 触摸控件(View)首先执行dispatchTouchEvent方法。
  2. 在dispatchTouchEvent方法中先执行onTouch方法,后执行onClick方法(onClick方法在onTouchEvent中执行,下面会分析)。
  3. 如果控件(View)的onTouch返回false或者mOnTouchListener为null(控件没有设置setOnTouchListener方法)或者控件不是enable的情况下会调运onTouchEvent,dispatchTouchEvent返回值与onTouchEvent返回一样。
  4. 如果控件不是enable的设置了onTouch方法也不会执行,只能通过重写控件的onTouchEvent方法处理(上面已经处理分析了),dispatchTouchEvent返回值与onTouchEvent返回一样。
  5. 如果控件(View)是enable且onTouch返回true情况下,dispatchTouchEvent直接返回true,不会调用onTouchEvent方法。
  6. 当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发下一个action(也就是说dispatchTouchEvent返回true才会进行下一次action派发)。

参考:Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

     Android触摸屏事件派发机制详解与源码分析一(View篇)

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

 

Android触摸屏事件派发机制详解与源码分析三(Activity篇)


0 0