• Android NestedScrolling与分发机制 二


        上篇转载了 Android:30分钟弄明白Touch事件分发机制

        这篇转载 Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

        下篇,将对NestedScrolling相关的四个方法汇总分析!

    然后再用二个Demo分别对以前5.0之前的View事件分发与NestedScrolling使用进行不同的实现!

    (转载二)
        Android中触摸事件传递过程中最重要的是dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()方法。这个是困扰初学者的问题之一,我开始也是。这里记录一下dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()的处理过程,以供记忆。

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

    super.dispatchTouchEvent(ev),事件向下分发。

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

        onTouchEvent是View中提供的方法,ViewGroup也有这个方法,view中不提供onInterceptTouchEvent。view中默认返回true,表示消费了这个事件。
    View里,有两个回调函数 :

    public boolean dispatchTouchEvent(MotionEvent ev);    

    public boolean onTouchEvent(MotionEvent ev);   

    ViewGroup里,有三个回调函数 :

    public boolean dispatchTouchEvent(MotionEvent ev);    

    public boolean onInterceptTouchEvent(MotionEvent ev);    

    public boolean onTouchEvent(MotionEvent ev);  

    Activity里,有两个回调函数 :

    public boolean dispatchTouchEvent(MotionEvent ev);    

    public boolean onTouchEvent(MotionEvent ev);    

        Android中默认情况下事件传递是由最终的view的接收到,传递过程是从父布局到子布局,也就是从Activity到ViewGroup到View的过程,默认情况,ViewGroup起到的是透传作用。Android中事件传递过程(按箭头方向)如下图,图片来自[qiushuiqifei],谢谢[qiushuiqifei]整理。

        触摸事件是一连串ACTION_DOWN,ACTION_MOVE..MOVE…MOVE、最后ACTION_UP,触摸事件还有ACTION_CANCEL事件。事件都是从ACTION_DOWN开始的,Activity的dispatchTouchEvent()首先接收到ACTION_DOWN,执行super.dispatchTouchEvent(ev),事件向下分发。

        dispatchTouchEvent()返回true,后续事件(ACTION_MOVE、ACTION_UP)会再传递,如果返回false,dispatchTouchEvent()就接收不到ACTION_UP、ACTION_MOVE。

    下面的几张图参考自[eoe]

     

                     图1.ACTION_DOWN都没被消费                                

                                                                      图2-1.ACTION_DOWN被View消费了 

                                         

     

                                                       图2-2.后续ACTION_MOVE和UP在不被拦截的情况下都会去找VIEW

                                  

                                                                        图3.后续的被拦截了

     

                                  

                                                                           图4ACTION_DOWN一开始就被拦截

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

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

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





  • 相关阅读:
    算数表达式二叉树
    Java汉诺塔算法
    Struts2中的设计模式ThreadLocal模式续
    Java基础知识总结(五)
    Java数组扩容算法及Java对它的应用
    Java Arrays.sort源代码解析
    Java字符串排列算法
    Java基础知识总结(三)
    SSIS OLE DB Source中执行带参数的存储过程
    Sql server中Collation conflict问题
  • 原文地址:https://www.cnblogs.com/ut2016-progam/p/5345661.html
Copyright © 2020-2023  润新知