动态渐变状态栏

动态渐变的状态栏在个人信息中比较常见,实现的就是滑动显示和隐藏的一个渐变效果,主要是使用CoordinatorLayout和AppBarLayout实现。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/background_light"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/mainAppbar"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:fitsSystemWindows="true"
        app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/main.collapsing"
            android:layout_width="match_parent"
            android:layout_height="250dp"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:collapsedTitleGravity="center"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:id="@+id/main.backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                android:scaleType="fitXY"
                android:src="@mipmap/bg"
                app:layout_collapseMode="parallax" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:title="标题栏"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
        </android.support.design.widget.CollapsingToolbarLayout>

        <LinearLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:layout_alignParentBottom="true"
            android:background="?attr/colorPrimary"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="测试" />

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

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="2000dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="2000dp"
            android:background="@color/colorPrimary"
            android:orientation="vertical">

        </LinearLayout>

    </android.support.v4.widget.NestedScrollView>


</android.support.design.widget.CoordinatorLayout>

布局即可实现滑动显示隐藏的效果,渐变无非是检测滑动距离来改变透明度;

setSupportActionBar(toolbar);
        mainAppbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                //verticalOffset  当前偏移量 appBarLayout.getTotalScrollRange() 最大高度 便宜值
                int Offset = Math.abs(verticalOffset); //目的是将负数转换为绝对正数;
                //标题栏的渐变
               toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
               toolbar.setAlpha((Offset/(appBarLayout.getTotalScrollRange() *1.0f)));
                /**
                 * 当前最大高度便宜值除以2 在减去已偏移值 获取浮动 先显示在隐藏
                 */
               /* if (Offset < appBarLayout.getTotalScrollRange() / 2) {
//                    toolbar.setTitle("");
                    toolbar.setAlpha((appBarLayout.getTotalScrollRange() / 2 - Offset * 1.0f) / (appBarLayout.getTotalScrollRange() / 2));
                    toolbar.setNavigationIcon(R.mipmap.icon_white_back);
                    *//**
                     * 从最低浮动开始渐显 当前 Offset就是  appBarLayout.getTotalScrollRange() / 2
                     * 所以 Offset - appBarLayout.getTotalScrollRange() / 2
                     *//*
                } else if (Offset > appBarLayout.getTotalScrollRange() / 2) {
                    float floate = (Offset - appBarLayout.getTotalScrollRange() / 2) * 1.0f / (appBarLayout.getTotalScrollRange() / 2);
                    toolbar.setAlpha(floate);
                    toolbar.setNavigationIcon(R.mipmap.icon_white_back);
//                    toolbar.setTitle("标题栏");
                    toolbar.setAlpha(floate);
                }*/
            }
        });

    }

这里主要说一下layout_scrollFlags这个参数,滑动效果就是由这个参数控制的。

注意:这些布局控件依赖于design包,因此需要导入依赖。

implementation'com.android.support:design:28.0.0'

layout_behavior属性说明:Behavior是一系列回调。为View添加动态的依赖布局,和处理父布局(CoordinatorLayout)滑动手势。