Android触摸事件的传递与处理

来源:互联网 发布:超盟数据李健豪 编辑:程序博客网 时间:2024/06/05 07:13

了解Android控件的触摸事件的传递与处理对我们开发中自定义控件和触摸事件的冲突解决有很大作用。我们先来看看与触摸事件相关的几个方法:

 

boolean dispatchTouchEvent(MotionEvent ev):收到触摸事件时,是否分发给下面的View,返回true时分发事件,返回false不分发下面的view拿不到触摸事件。

 

boolean onInterceptTouchEvent(MotionEventev):收到触摸事件时,是否拦截事件,返回true时拦截此时调用onTouchEvent()方法处理事件;返回false时不拦截,事件继续往下面的View传递。

 

boolean onTouchEvent(MotionEvent ev):是否响应事件,返回true响应;返回false不响应。

Boolean onTouch(View v,MotionEvent ev):是否响应事件,当view调用了setOnTouchListener方法设置了监听器时,事件响应的时候会先调用onTouch()方法。返回true时响应,onTouchEvent()方法不执行;返回false时不响应并调用onTouchEvent()方法。

 

void requestDisallowInterceptTouchEvent(booleandisallowIntercept):请求父空间是否拦截触摸事件,返回true时不允许父控件的onInterceptTouchEvent调用,返回false时允许父控件拦截触摸事件。

 

         当Activity接收到触摸事件时它只会分发到下面的父控件,父控件先判断是否拦截,如果不拦截则继续向下分发给子view,然后一路分发。触摸事件的处理与分发相反,是由子控件先处理,如果子控件没有处理则交给父级控件处理,一直向上处理,直到某级控件处理了事件则事件处理到此结束。

        当触摸屏幕时,从按下到移动再到抬起,会产生ACTION_DOWNACTION_MOVE ACTION_UP三种触摸事件,事件会先传递到Activity,然后Activity调用事件分发方法dispatchTouchEvent(),如果返回true,则事件传递给Activity的第一级父控件。

父控件拿到触摸事件后,也会调用事件分发分发方法dispatchTouchEvent(),如果返回true,则继续调用拦截方法onInterceptTouchEvent(),如果拦截方法返回true则父控件拦截了事件,并调用父控件的onTouchEvent()方法,下面的字=子控件就不会再响应onTouchEvent(),onTouch()方法了。

       子控件拿到事件后,先判断是否设置了OnTouchListenr,如果设置了则调用OnTouchListener的onTouch()方法,如果此onTouch()方法返回true则事件处理到此结束并跳过onTouchEvent()方法,否则调用onTouchEvent()方法,当onTouchEvent()方法返回true,则事件处理到此结束,上面的父控件就不会再调用onToucEvent()方法(通过Android源码view中dispatchTouchEvent的实现我们可以看到onTouchListener的接口的优先级是高于onTouchEvent()的,如果onTouchListener的onTouch()方法返回true则表示此次事件已经被处理,那么onTouchEvent是接收不到消息的)。

       如果某一个控件响应了ACTION_DOWN事件,则后续的ACTION_MOVEACTION_UP事件就会直接交给该控件处理,除非它的父控件拦截了后续的事件,可以在处理ACTION_DOWN时调用requestDisallowInterceptTouchEvent()来禁止父控件的拦截。如果控件没有处理ACTION_DOWN事件,则后续的事件就不会再传到该控件,当下一次的ACTION_DOWN事件产生时,还是会传递给改控件。

1 0