Android的事件分发机制 ---dispatcTouchEvent、onInterceptTouchEvent、onTouchEvent

来源:互联网 发布:最后的武士 知乎 编辑:程序博客网 时间:2024/05/17 05:52

 想自己定义一个控件,简单的还好,特别是继承ViewGroup的时候,子元素一多,按这个怎么没效果,按那个没效果,或者是混乱了。  这下,你就得知道要通过view的事件的分发来控制了。     


        事件分发的三个重要方法dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()。


        这三个方法返回的类型都是boolean类型,返回true都是说自己消费了这个touch事件,不需要下一层再去管了。


        接下来就讲讲这3个方法的区别:

(1)dispatchTouchEvent(): 用来事件的分发。 如果事件能够传递给当前事件,那么此方法一定就会被调用,意思就是该View的父容器没有消耗touch事件,怎样才算没有被消耗呢,下面会讲到。


(2)onInterceptTouchEvent(): 在上诉方法内部调用,用来判断是否拦截某个事件,如果该方法返回ture 就代表下面的子布局就不会有执行onTouchEvent的机会了。需要强调的是View 中没有这个方法的实现


(3)onTouchEvent():在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件。


          我们通过代码来看看:

<span style="white-space:pre"></span><pre name="code" class="java">public boolean diapatchTouchEvent(MotionEvent ev){ //最顶级父容器ViewGourpboolean consume = false; //默认的viewGourp返回值都是falseif(onInterceptTouchEvent(ev)){是否拦截这个事件consume = onTouchEvent(ev); 默认的View的onTouchEvent都会消费这个事件(返回true)}else{consume = child.dispatchTouchEvent(ev);若没有被拦截,则传递给他的孩子来管理这个事件         }  return consume;}


          上述伪代码已经说的很明显了。

           分发事件的几个结论:


           (1)同一个事件序列是从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以down事件开始,中间含有若干个move事件,最终已up事件结束。

           (2)正常情况下,一个事件序列只能够被一个view拦截且消耗掉,但是可以通过特殊手段做到,比如一个View将本该自己处理的事件通过onTouchEvent强行传递给其他View处理

        (3)ViewGourp默认不会拦截任何事件。

    (4)View的onTouchEvent默认都会消耗事件(返回true),除非它是不可点击的(clickable和longClickable同时为false);

    (5)View的enable属性不影响onTouchEvent的默认返回值。

    (6)View一旦设置了点击监听器,super.onTouchEvent()   返回的则是true;

      (7)  View 如果设置了OnTouchListener,那么onTouchEvent就不会被调用了。


             我刚开始看到这些的时候也是要记的觉得好多,但是想要学好,一定得知道。还有多看看源码,我懒得打源码去分析了。 


             就这样,有什么问题可以留言,一起讨论。哈哈!

  


      

0 0
原创粉丝点击