zoukankan      html  css  js  c++  java
  • Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

     dispatchTouchEvent (分发TouchEvent

      处理触摸事件分发,事件(多数情况)是从Activity的dispatchTouchEvent开始的。执行super.dispatchTouchEvent(ev),事件向下分发。

    onInterceptTouchEvent (拦截TouchEvent

      ViewGroup提供的方法,默认返回false,返回true表示拦截。

    onTouchEvent (处理TouchEvent

      View中提供的方法,ViewGroup也有这个方法,view中不提供onInterceptTouchEvent。view中默认返回true,表示消费了这个事件。

    View类中的两个方法:

    1 public boolean dispatchTouchEvent(MotionEvent ev);    
    2 public boolean onTouchEvent(MotionEvent ev);   

    ViewGroup继承View,而且还新添了一个onInterceptTouchEvent方法:

    1 public boolean dispatchTouchEvent(MotionEvent ev);    
    2 public boolean onInterceptTouchEvent(MotionEvent ev);    
    3 public boolean onTouchEvent(MotionEvent ev);  

    Activity类中的两个方法:

    1 public boolean dispatchTouchEvent(MotionEvent ev);    
    2 public boolean onTouchEvent(MotionEvent ev);    

    触摸事件传递流程:

    当触摸事件ACTION_DOWN发生之后,先调用Activity中的dispatchTouchEvent函数进行处理,紧接着ACTION_DOWN事件传递给ViewGroup中的dispatchTouchEvent函数,接着viewGroup中的dispatchTouchEvent中的ACTION_DOWN事件传递到调用ViewGroup中的onInterceptTouchEvent函数,此函数负责拦截ACTION_DOWN事件。由于viewGroup下还包含子View,所以默认返回值为false,即不拦截此ACTION_DOWN事件。如果返回false,则ACTION_DOWN事件继续传递给其子view。由于子view不是viewGroup的控件,所以ACTION_DOWN事件接着传递到onTouchEvent进行处理事件。此时消息的传递基本上结束。

    (1) ACTION_DOWN开启。

    (2) 如果在ViewGroup的onInterceptTouchEvent拦截器中将消息拦截了,则后续不会再向子控件传递ACTION_DOWN消息了,会直接将消息传递给这个ViewGroup的onTouchEvent进行响应。

    (1) 在控件进行onTouchEvent处理过程中,如果控件没有消费这个ACTION_DOWN事件(即返回false),则会将ACTION_DOWN传递给其父ViewGroup的onTouchEvent进行处理,直到由哪一层ViewGroup消费了ACTION_DOWN事件为止。

    (2) 如果有哪一个控件的onTouchEvent消费了ACTION_DOWN事件,则后续的n个ACTION_MOVE与1个ACTION_UP都会逐层传递到这个控件的onTouchEvent进行处理。

    (3) 每层的拦截器还是可以拦截到后续的ACTION_MOVE与ACTION_UP。如果后续的ACTION_MOVE与ACTION_UP被某层的拦截器拦截,则后续的事件将不会再传递给之前处理onTouchEvent的子控件,而是逐层传递给由拦截消息的这个控件的onTouchEvent函数进行处理,并且会向其之前接收事件的子控件发送一个ACTION_CANCEL,表示后续事件被取消了。

    (4) 所有控件的onTouchEvent都没有消费ACTION_DOWN事件,每层dispatchTouchEvent 都会返回false,表示事件没有被派发出去,后续的ACTION_MOVE与ACTION_UP也都不会再被传递了。

    最后:

    android中的Touch事件都是从ACTION_DOWN开始的。

    单手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP

    多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.

    参考:

    http://blog.csdn.net/xyz_lmn/article/details/12517911

    http://blog.csdn.net/qiushuiqifei/article/details/9918527

    http://www.2cto.com/kf/201503/384511.html

    http://www.eoeandroid.com/thread-319301-1-1.html?_dsign=495a5374

  • 相关阅读:
    linux下的shell 快捷键
    Python3.x和Python2.x的区别
    [Python2.x] 利用commands模块执行Linux shell命令
    redis缓存策略
    高并发解决方案
    java8 lambda表达式应用
    java读写分离的实现
    数据库读写分离
    大数据量处理方案:分布式数据库
    google的CacheBuilder缓存
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/4923420.html
Copyright © 2011-2022 走看看