android嵌套滚动入门实践

 更新时间:2018年05月31日 10:38:46   作者:Glan Wang  
嵌套滚动是 Android OS 5.0之后,google 为我们提供的新特性,本篇文章主要介绍了android嵌套滚动入门实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

嵌套滚动是 Android OS 5.0之后,google 为我们提供的新特性。这种机制打破了我们对之前 Android 传统的事件处理的认知。从一定意义上可以理解为嵌套滚动是逆向的事件传递机制。

如上图所示,其原理就是这样。那么下边我们从代码的层面看一下实现。

代码中主要涉及到了四个类:

NestedScrollingChild、NestedScrollingChildHelper、NestedScrollingParent、NestedScrollingParentHelper

先看NestedScrollingChild 接口中定义的方法: 

public interface NestedScrollingChild {
  /**
   * 设置是否启用嵌套滚动
   */
  public void setNestedScrollingEnabled(boolean enabled);

  /**
   * 判断是否启用嵌套滚动
   */
  public boolean isNestedScrollingEnabled();

  /**
   * 开始嵌套滚动   
   * @param axes 标识方向,有 x, y 方形和默认值0
   */
  public boolean startNestedScroll(int axes);

  /**
   * 嵌套滚动结束
   */
  public void stopNestedScroll();

  /**    
   * 判断父 view 是否支持嵌套滚动
   */
  public boolean hasNestedScrollingParent();

  /**
   * 分发嵌套滚动,一般再 onTouch/onInterceptTouchEvent/dispatchTouchEvent 中调用
   * @param dxConsumed x轴滚动的距离
   * @param dyConsumed y 轴滚动的距离
   * @param dxUnconsumed x 轴上未消费的距离
   * @param dyUnconsumed y 轴上未消费的距离
   * @param offsetInWindow 子 View 的窗体偏移
   */
  public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed,
      int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow);

  /**
   * 滚动之前调用,进行分发预滚动事件
   */
  public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow);

  /**
   * 滑动时调用 ,分发滑动事件
   */
  public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed);

  /**
  * 滚动之前调用,分发预滚动事件
   */
  public boolean dispatchNestedPreFling(float velocityX, float velocityY);
}
NestedScrollingParent 接口中的方法均是与NestedScrollingChild 中的方法一一对应的:
 
public interface NestedScrollingParent {

  public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes);

  public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes);

  public void onStopNestedScroll(View target);

  public void onNestedScroll(View target, int dxConsumed, int dyConsumed,
      int dxUnconsumed, int dyUnconsumed);

  public void onNestedPreScroll(View target, int dx, int dy, int[] consumed);

  public boolean onNestedFling(View target, float velocityX, 
                           float velocityY,boolean consumed);
 
  public boolean onNestedPreFling(View target, float velocityX, float velocityY);

  public int getNestedScrollAxes();
}

以上两个类仅仅是定义了功能接口,真正的实现的代码都包含在了NestedScrollingChildHelper和NestedScrollingParentHelper中。

处理流程:

1、当 NestedScrollingChild(下文用Child代替) 要开始滑动的时候会调用 onStartNestedScroll ,然后交给代理类NestedScrollingChildHelper(下文ChildHelper代替)的onStartNestedScroll请求给最近的NestedScrollingParent(下文Parent代替).

2、当ChildHelper的onStartNestedScroll方法 返回 true 表示同意一起处理 Scroll 事件的时候时候,ChildHelper会通知Parent回调onNestedScrollAccepted 做一些准备动作

3、当Child 要开始滑动的时候,会先发送onNestedPreScroll,交给ChildHelper的onNestedPreScroll 请求给Parent ,告诉它我现在要滑动多少距离,你觉得行不行,这时候Parent 根据实际情况告诉Child 现在只允许你滑动多少距离.然后 ChildHelper根据 onNestedPreScroll 中回调回来的信息对滑动距离做相对应的调整.

4、在滑动的过程中 Child 会发送onNestedScroll通知ChildeHelpaer的onNestedScroll告知Parent 当前 Child 的滑动情况.

5、当要进行滑行的时候,会先发送onNestedFling 请求给Parent,告诉它 我现在要滑行了,你说行不行, 这时候Parent会根据情况告诉 Child 你是否可以滑行.

6、Child 通过onNestedFling 返回的 Boolean 值来觉得是否进行滑行.如果要滑行的话,会在滑行的时候发送onNestedFling 通知告知 Parent 滑行情况.

7、当滑动事件结束就会child发送onStopNestedScroll通知 Parent 去做相关操作.

废话不多说了,看代码和 demo 才是正事儿。https://github.com/JeffWangGithub/StickLayout

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android串口通信apk源码详解(附完整源码)

    Android串口通信apk源码详解(附完整源码)

    这篇文章主要介绍了Android串口通信apk源码详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Flutter DateTime日期转换的详细使用

    Flutter DateTime日期转换的详细使用

    本文主要介绍了Flutter DateTime日期转换的详细使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Android 获取判断是否有悬浮窗权限的方法

    Android 获取判断是否有悬浮窗权限的方法

    今天小编就为大家分享一篇Android 获取判断是否有悬浮窗权限的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android Studio调试功能使用汇总

    Android Studio调试功能使用汇总

    这篇文章主要为大家详细介绍了Android Studio调试功能使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Flutter使用Overlay与ColorFiltered新手引导实现示例

    Flutter使用Overlay与ColorFiltered新手引导实现示例

    这篇文章主要介绍了Flutter使用Overlay与ColorFiltered新手引导实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android再探全面屏适配示例详解

    Android再探全面屏适配示例详解

    这篇文章主要为大家介绍了Android再探全面屏适配示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • android开发教程之开机启动服务service示例

    android开发教程之开机启动服务service示例

    如果开机启动一个Activity,开机首先看的界面,是你的程序界面,如果为了,开机后也启动你的程序,但是不显示自己程序的界面,就要用Service服务,下面是开机启动服务service示例
    2014-03-03
  • Android开发EditText实现密码显示隐藏

    Android开发EditText实现密码显示隐藏

    这篇文章主要为大家详细介绍了Android开发EditText实现密码显示隐藏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Android中系统自带锁WalkLock与KeyguardLock用法实例详解

    Android中系统自带锁WalkLock与KeyguardLock用法实例详解

    这篇文章主要介绍了Android中系统自带锁WalkLock与KeyguardLock用法,结合实例形式较为详细的分析了WalkLock与KeyguardLock的功能、作用、使用方法与相关注意事项,需要的朋友可以参考下
    2016-01-01
  • Android Kotlin开发实例(Hello World!)及语法详解

    Android Kotlin开发实例(Hello World!)及语法详解

    这篇文章主要介绍了Android Kotlin开发实例及语法详解的相关资料,需要的朋友可以参考下
    2017-05-05

最新评论