• 嵌套滚动demo


    https://github.com/luv135/NestedScrollingDemo

    https://github.com/ggajews/nestedscrollingchildviewdemo

    ViewParentCompat是一个和父view交互的兼容类,它会判断api version,如果在Lollipop以上,就是用view自带的方法,否则判断是否实现了NestedScrollingParent接口,去调用接口的方法。

    那么具体我们怎么使用这一套机制呢?比如子View这时候我需要通知父view告诉它我有一个嵌套的touch事件需要我们共同处理。那么针对一个只包含scroll交互,它整个工作流是这样的:

    一、startNestedScroll

    首先子view需要开启整个流程(内部主要是找到合适的能接受nestedScroll的parent),通知父View,我要和你配合处理TouchEvent

    二、dispatchNestedPreScroll

    在子View的onInterceptTouchEvent或者onTouch中(一般在MontionEvent.ACTION_MOVE事件里),调用该方法通知父View滑动的距离。该方法的第三第四个参数返回父view消费掉的scroll长度和子View的窗体偏移量。如果这个scroll没有被消费完,则子view进行处理剩下的一些距离,由于窗体进行了移动,如果你记录了手指最后的位置,需要根据第四个参数offsetInWindow计算偏移量,才能保证下一次的touch事件的计算是正确的。

    如果父view接受了它的滚动参数,进行了部分消费,则这个函数返回true,否则为false。

    这个函数一般在子view处理scroll前调用。

    三、dispatchNestedScroll

    向父view汇报滚动情况,包括子view消费的部分和子view没有消费的部分。

    如果父view接受了它的滚动参数,进行了部分消费,则这个函数返回true,否则为false。

    这个函数一般在子view处理scroll后调用。
    <!--[if !supportLineBreakNewLine]-->
    <!--[endif]-->

    四、stopNestedScroll

    结束整个流程。

    整个对应流程是这样

    子view   父view

    startNestedScroll onStartNestedScroll、onNestedScrollAccepted

    dispatchNestedPreScroll    onNestedPreScroll

    dispatchNestedScroll  onNestedScroll

    stopNestedScroll onStopNestedScroll

    一般是子view发起调用,父view接受回调。

    我们最需要关注的是dispatchNestedPreScroll中的consumed参数。

        public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) ;

    它是一个int型的数组,长度为2,第一个元素是父view消费的x方向的滚动距离;第二个元素是父view消费的y方向的滚动距离,如果这两个值不为0,则子view需要对滚动的量进行一些修正。正因为有了这个参数,使得我们处理滚动事件的时候,思路更加清晰,不会像以前一样被一堆的滚动参数搞混。

  • 相关阅读:
    Qt之QLineEdit
    Redis与Java
    Qt之属性系统
    Qt之Meta-Object系统
    设计模式(八)外观模式
    Qt之QRadioButton
    Qt之QSystemTrayIcon
    Redis与Java
    JSP公用COMMON文件
    eclipse远程调试Tomcat方法[转]
  • 原文地址:https://www.cnblogs.com/xiaorenwu702/p/5092106.html
Copyright © 2020-2023  润新知