反编译简书app和小红书app滑动效果sticky粘性头布局的实现CoordinatorLayout+behaviorjava
小红书效果:
android
简书效果:
git
demo效果图:
github
github地址:https://github.com/gm365066360/FlingBehaviorweb
apk下载地址:http://fir.im/zk9gapp
部分代码: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;
}
}