一、效果图
二、实现
关键 behaviro:
**** 自定义Behavior :实现RecyclerView(或者其他可滑动View,如:NestedScrollView) 滑动覆盖header 的效果* Created by zhouwei on 16/12/19.*/public class CoverHeaderScrollBehavior extends CoordinatorLayout.Behavior<View> {public static final String TAG = "CoverHeaderScroll";public CoverHeaderScrollBehavior(Context context, AttributeSet attributeSet){super(context,attributeSet);}@Overridepublic boolean onLayoutChild(CoordinatorLayout parent, View child, int layoutDirection) {Log.i(TAG,"onLayoutChild.....");CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) child.getLayoutParams();if(params!=null && params.height == CoordinatorLayout.LayoutParams.MATCH_PARENT){child.layout(0,0,parent.getWidth(),parent.getHeight());child.setTranslationY(getHeaderHeight());return true;}return super.onLayoutChild(parent, child, layoutDirection);}@Overridepublic boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;}@Overridepublic 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;}}@Overridepublic void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);// 在这个方法里只处理向下滑动if(dyUnconsumed >0){return;}float transY = child.getTranslationY() - dyUnconsumed;Log.i(TAG,"------>transY:"+transY+"****** child.getTranslationY():"+child.getTranslationY()+"--->dyUnconsumed"+dxUnconsumed);if(transY > 0 && transY < getHeaderHeight()){child.setTranslationY(transY);}}/*** 获取Header 高度* @return*/public int getHeaderHeight(){return Objects.requireNonNull(App.Companion.getMContext()).getResources().getDimensionPixelOffset(R.dimen.m160);}}
布局文件:
<?xml version="1.0" encoding="utf-8"?><androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"><ImageViewandroid:layout_width="match_parent"android:layout_height="@dimen/m160"android:scaleType="centerCrop"android:src="@mipmap/wuhuang"/><androidx.core.widget.NestedScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"app:layout_behavior=".design.behavior.scroll.CoverHeaderScrollBehavior"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="@dimen/m12"android:text="@string/large_text" /></androidx.core.widget.NestedScrollView></androidx.coordinatorlayout.widget.CoordinatorLayout>

