反编译简书app和小红书app滑动效果sticky粘性头布局的实现CoordinatorLayout+behavior

反编译简书app和小红书app滑动效果sticky粘性头布局的实现CoordinatorLayout+behaviorjava

小红书效果:
xiaohongshuu.gifandroid

简书效果:
jianshug.gifgit

demo效果图:
FlingBehavior.gifgithub

github地址:https://github.com/gm365066360/FlingBehaviorweb

apk下载地址:http://fir.im/zk9gapp

miao.gif

部分代码:svg

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent">

    <android.support.design.widget.CoordinatorLayout  android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="false" android:fitsSystemWindows="true" app:layout_behavior="com.gaom.flingbehaviordemo.FlingBehavior">

            <android.support.design.widget.CollapsingToolbarLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="true" android:fitsSystemWindows="true" app:contentScrim="#ff4444" app:expandedTitleMarginEnd="60dp" app:expandedTitleMarginStart="48dp" app:layout_scrollFlags="scroll" app:statusBarScrim="#feaa33" app:toolbarId="@+id/toolbar">

                <!--2-->
                <ImageView  android:id="@+id/main.backdrop" android:layout_width="match_parent" android:layout_height="300dp" android:scaleType="centerCrop" android:src="@drawable/me" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.7" />

                <android.support.v7.widget.Toolbar  android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="100dp" android:layout_gravity="center" android:clipChildren="false" app:contentInsetLeft="0dp" app:contentInsetStart="0dp" app:layout_collapseMode="parallax">

                    <LinearLayout  android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="100dp" android:fitsSystemWindows="true" android:orientation="vertical" app:layout_collapseParallaxMultiplier="0.7" app:layout_scrollFlags="scroll" app:titleEnabled="false">

                        <LinearLayout  android:id="@+id/header_view" android:layout_width="match_parent" android:layout_height="100dp" android:animateLayoutChanges="true" android:background="#77333333" android:fitsSystemWindows="true" android:orientation="vertical" app:layout_collapseParallaxMultiplier="0.7">

                            <TextView  android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" android:text="我是视察的View,哦,背景也是,能够设置比例哦~" android:textColor="#fff" />

                        </LinearLayout>

                        <FrameLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="invisible" />
                    </LinearLayout>

                </android.support.v7.widget.Toolbar>

                <LinearLayout  android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="bottom" android:layout_marginBottom="30dp" android:layout_marginTop="?attr/actionBarSize" android:background="@android:color/transparent" android:gravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal|fill_horizontal|center|fill|start|end" android:orientation="vertical" app:layout_collapseMode="pin">

                    <TextView  android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:background="#77333333" android:gravity="center" android:text="我是固定不动被顶着走的view" android:textColor="#000" />

                </LinearLayout>
            </android.support.design.widget.CollapsingToolbarLayout>

            <LinearLayout  android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="top|bottom|center_vertical|fill_vertical|center|fill" android:orientation="vertical">

                <android.support.design.widget.TabLayout  android:id="@+id/tablayout_user" android:layout_width="match_parent" android:layout_height="50dp" android:background="@color/colorPrimary" app:layout_scrollFlags="enterAlways" app:tabGravity="center" app:tabIndicatorColor="@android:color/white" app:tabIndicatorHeight="2dp" app:tabMaxWidth="0dp" app:tabMode="fixed" app:tabPaddingEnd="20dp" app:tabPaddingStart="20dp" app:tabSelectedTextColor="@android:color/black" app:tabTextColor="@android:color/white" />

                <View  android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/colorPrimary" />

            </LinearLayout>
        </android.support.design.widget.AppBarLayout>

        <android.support.v4.view.ViewPager  android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    </android.support.design.widget.CoordinatorLayout>

    <LinearLayout  android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="top|bottom|center_vertical|fill_vertical|center|fill" android:background="@android:color/transparent" android:orientation="vertical">

    </LinearLayout>
</RelativeLayout>
package com.gaom.flingbehaviordemo;

import android.content.Context;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.AppBarLayout.Behavior;
import android.support.design.widget.CoordinatorLayout;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

public class FlingBehavior extends Behavior {
    private boolean a;

    public FlingBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
        if ((velocityY > 0.0f && !this.a) || (velocityY < 0.0f && this.a)) {
            velocityY *= -1.0f;
        }
        if ((target instanceof RecyclerView) && velocityY < 0.0f) {
            RecyclerView recyclerView = (RecyclerView) target;
            if (recyclerView.getChildAdapterPosition(recyclerView.getChildAt(0)) > 3) {
                consumed = true;
            } else {
                consumed = false;
            }
        }
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }

    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        this.a = dy > 0;
    }
}