@Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { //如果在顶部 if (((RecyclerView) target).getChildAt(0).getY() == 0) { //向下滑动 if (dy < 0) { mDependency.setY(mDependency.getY() - dy); //小于阀值 if (mDependency.getY() < 500) { mDependency.restore(mDependency.getY()); } } } super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); } }
/** * 触发滑动嵌套滚动之前调用的方法 * * @param coordinatorLayout coordinatorLayout父布局 * @param child 使用Behavior的子View * @param target 触发滑动嵌套的View(实现NestedScrollingChild接口) * @param dx 滑动的X轴距离 * @param dy 滑动的Y轴距离 * @param consumed 父布局消费的滑动距离,consumed[0]和consumed[1]代表X和Y方向父布局消费的距离,默认为0 */ @Override public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, ViewCompat.TYPE_TOUCH); mIBehaviorAnim.setDuration(mDuration); mIBehaviorAnim.setInterpolator(mInterpolator); }
@Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); // 在这个方法里面只处理向上滑动 if(dy < 0){ return; } float transY = child.getTranslationY() - dy; Log.i(TAG,"transY:"+transY+"++++child.getTranslationY():"+child.getTranslationY()+"---->dy:"+dy); if(transY > 0){ child.setTranslationY(transY); consumed[1]= dy; } }
/** * @param dy 向上滑大于0 */ @Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); mUp = dy > 0; if(isChildRequestScroll(child.getTranslationY())){//如果list需要滑动这边就不动 consumed[1]=0; return; } consumed[1]=dy;//全部消耗 int distance = -dy / 2;//降低移动的速度 if (child.getTranslationY() + distance < -mMaxDistance) { distance = -mMaxDistance; } else if (child.getTranslationY() + distance > 0) { distance = 0; } else { distance = (int) (child.getTranslationY() + distance); } child.setTranslationY(distance); }
/** * 嵌套滚动发生之前被调用 * 在nested scroll child 消费掉自己的滚动距离之前,嵌套滚动每次被nested scroll child * 更新都会调用onNestedPreScroll。注意有个重要的参数consumed,可以修改这个数组表示你消费 * 了多少距离。假设用户滑动了100px,child 做了90px 的位移,你需要把 consumed[1]的值改成90, * 这样coordinatorLayout就能知道只处理剩下的10px的滚动。 * @param coordinatorLayout * @param child * @param target * @param dx 用户水平方向的滚动距离 * @param dy 用户竖直方向的滚动距离 * @param consumed */ @Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); }
@Override public void onPageSelected(int i) { /**不同的recyclerView的列表对应的位置不同,需要处理对应的顶部banner是否隐藏*/ curTab = i; scrollAppbar.removeOnOffsetChangedListener(MainActivity.this); int scrollHeight = (i == 0) ? scrollOffsetSquare : scrollOffsetAttention; if (scrollHeight == -scrollAppbar.getTotalScrollRange()) { CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) scrollAppbar.getLayoutParams()).getBehavior(); behavior.onNestedPreScroll(scrollCoordinatorLayout, scrollAppbar, fragmentList.get(i).getScrollableView(), 0, scrollAppbar.getTotalScrollRange(), new int[]{0, 0}); onOffsetChanged(scrollAppbar, scrollAppbar.getTotalScrollRange()); } scrollSwipeRefreshLayout.setEnabled(false); scrollAppbar.addOnOffsetChangedListener(MainActivity.this); }
@Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); if (dy > 0 && mTotalDy < 0) { mTotalDy = 0; mScrollDirection = ScrollDirection.SCROLL_DIRECTION_UP; } else if (dy < 0 && mTotalDy > 0) { mTotalDy = 0; mScrollDirection = ScrollDirection.SCROLL_DIRECTION_DOWN; } mTotalDy += dy; onDirectionNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, mScrollDirection); }
@Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); if (dy > 0 && mTotalDy < 0) { mTotalDy = 0; mScrollDirection = ScrollDirection.SCROLL_DIRECTION_UP; } else if (dy < 0 && mTotalDy > 0) { mTotalDy = 0; mScrollDirection = ScrollDirection.SCROLL_DIRECTION_DOWN; } mTotalDy += dy; onDirectionNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, mScrollDirection); }
private void refreshToTop1() { CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) scrollAppbar.getLayoutParams()).getBehavior(); behavior.onNestedPreScroll(scrollCoordinatorLayout, scrollAppbar, fragmentList.get(0).getScrollableView(), 0, scrollAppbar.getTotalScrollRange(), new int[]{0, 0}); onOffsetChanged(scrollAppbar, scrollAppbar.getTotalScrollRange()); fragmentList.get(0).changeToTop(); }
/** * 开始滚动前 */ @Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { int scrollY = target.getScrollY(); child.setScrollY(scrollY); super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); }
private void refreshToTop2() { CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) scrollAppbar.getLayoutParams()).getBehavior(); behavior.onNestedPreScroll(scrollCoordinatorLayout, scrollAppbar, fragmentList.get(1).getScrollableView(), 0, scrollAppbar.getTotalScrollRange(), new int[]{0, 0}); onOffsetChanged(scrollAppbar, scrollAppbar.getTotalScrollRange()); fragmentList.get(1).changeToTop(); }
@Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); }
@Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); if (dy > 0 && totalDy < 0) { totalDy = 0; scrollDirection = ScrollDirection.SCROLL_DIRECTION_UP; } else if (dy < 0 && totalDy > 0) { totalDy = 0; scrollDirection = ScrollDirection.SCROLL_DIRECTION_DOWN; } totalDy += dy; onDirectionNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, scrollDirection); }