content: package com.jennifer.andy.nestedscrollingdemo.ui.nested.normal_form;
  
  import android.content.Context;
  import android.support.annotation.NonNull;
  import android.support.v4.view.NestedScrollingParent2;
  import android.support.v4.view.NestedScrollingParentHelper;
  import android.view.View;
  import android.widget.LinearLayout;
  
  /**
   * Author:  andy.xwt
   * Date:    2019-06-28 00:13
   * Description:
   */
  
  public class NestedScrollingParent2View extends LinearLayout implements NestedScrollingParent2 {
  
      private NestedScrollingParentHelper mNestedScrollingParentHelper = new NestedScrollingParentHelper(this);
  
      public NestedScrollingParent2View(Context context) {
          super(context);
      }
  
  
      /**
       * 有嵌套滑动到来了，判断父view是否接受嵌套滑动
       *
       * @param child            嵌套滑动对应的父类的子类(因为嵌套滑动对于的父View不一定是一级就能找到的，可能挑了两级父View的父View，child的辈分>=target)
       * @param target           具体嵌套滑动的那个子类
       * @param nestedScrollAxes 支持嵌套滚动轴。水平方向，垂直方向，或者不指定
       * @param type             滑动类型，ViewCompat.TYPE_NON_TOUCH fling 效果ViewCompat.TYPE_TOUCH 手势滑动
       */
      @Override
      public boolean onStartNestedScroll(@NonNull View child, @NonNull View target, int nestedScrollAxes, int type) {
          //自己处理逻辑
          return true;
      }
  
      /**
       * 当父view接受嵌套滑动，当onStartNestedScroll方法返回true该方法会调用
       *
       * @param type 滑动类型，ViewCompat.TYPE_NON_TOUCH fling 效果ViewCompat.TYPE_TOUCH 手势滑动
       */
      @Override
      public void onNestedScrollAccepted(@NonNull View child, @NonNull View target, int axes, int type) {
          mNestedScrollingParentHelper.onNestedScrollAccepted(child, target, axes, type);
      }
  
      /**
       * 在嵌套滑动的子View未滑动之前，判断父view是否优先与子view处理(也就是父view可以先消耗，然后给子view消耗）
       *
       * @param target   具体嵌套滑动的那个子类
       * @param dx       水平方向嵌套滑动的子View想要变化的距离
       * @param dy       垂直方向嵌套滑动的子View想要变化的距离 dy<0向下滑动 dy>0 向上滑动
       * @param consumed 这个参数要我们在实现这个函数的时候指定，回头告诉子View当前父View消耗的距离
       *                 consumed[0] 水平消耗的距离，consumed[1] 垂直消耗的距离 好让子view做出相应的调整
       * @param type     滑动类型，ViewCompat.TYPE_NON_TOUCH fling 效果ViewCompat.TYPE_TOUCH 手势滑动
       */
      @Override
      public void onNestedPreScroll(@NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) {
          //自己处理逻辑
      }
  
      /**
       * 嵌套滑动的子View在滑动之后，判断父view是否继续处理（也就是父消耗一定距离后，子再消耗，最后判断父消耗不）
       *
       * @param target       具体嵌套滑动的那个子类
       * @param dxConsumed   水平方向嵌套滑动的子View滑动的距离(消耗的距离)
       * @param dyConsumed   垂直方向嵌套滑动的子View滑动的距离(消耗的距离)
       * @param dxUnconsumed 水平方向嵌套滑动的子View未滑动的距离(未消耗的距离)
       * @param dyUnconsumed 垂直方向嵌套滑动的子View未滑动的距离(未消耗的距离)
       * @param type         滑动类型，ViewCompat.TYPE_NON_TOUCH fling 效果ViewCompat.TYPE_TOUCH 手势滑动
       */
      @Override
      public void onNestedScroll(@NonNull View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) {
          //自己处理逻辑
      }
  
      /**
       * 嵌套滑动结束
       *
       * @param type 滑动类型，ViewCompat.TYPE_NON_TOUCH fling 效果ViewCompat.TYPE_TOUCH 手势滑动
       */
      @Override
      public void onStopNestedScroll(@NonNull View child, int type) {
          mNestedScrollingParentHelper.onStopNestedScroll(child, type);
      }
  
      @Override
      public boolean onNestedPreFling(@NonNull View target, float velocityX, float velocityY) {
          //自己判断是否处理
          return false;
      }
  
      @Override
      public boolean onNestedFling(@NonNull View target, float velocityX, float velocityY, boolean consumed) {
          //自己处理逻辑
          return false;
      }
  
  
      @Override
      public int getNestedScrollAxes() {
          return mNestedScrollingParentHelper.getNestedScrollAxes();
      }
  }