Android实现沉浸式状态栏及标题栏滑动变色

Android实现沉浸式状态栏及标题栏滑动变色

效果图

1. 沉浸式状态栏的实现

沉浸式状态栏实现的方式有很多,可自行百度谷歌

此处沉浸式状态栏实现采用第三方开源库 ImmersionBar,集成方式可直接查看官方文档,这里只做演示

1.1 导入包
implementation 'com.gyf.immersionbar:immersionbar:2.3.2-beta01'
1.2 初始化
//这里需要注意初始化必须要在setContentView(view)之后执行
//解决状态栏与布局顶部重叠,官方文档提供六种方案
//ImmersionBar.with(this).titleBar(mToolBar).init() 
ImmersionBar.with(this).init()
1.3 关闭销毁
override fun onDestroy() {
    super.onDestroy()
    ImmersionBar.with(this).destroy()
}

到这,沉浸式状态栏的简单集成就实现了,当然根据布局复杂程度会有各种各样的问题,比如侧滑菜单,Fragment等中沉浸式状态栏的实现,详细可先查看文档

2. 标题栏随着滑动透明度(颜色)变化,目标效果如网易云音乐详情页

思路:标题栏后面添加一个ImageView作为标题栏的背景图片,标题栏为透明,考虑到背景图片为头部图片的底部截取,可将大小设置与头部图片一样,然后将其上移至标题栏部分;随着滑动的变化,将背景图片的透明度进行设置

布局示意图.png
toolbar背景图.png
2.1 布局文件如下
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:orientation="vertical"
    >

    <ScrollView
        android:id="@+id/mScrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/mIvHeadView"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:scaleType="centerCrop"
                android:src="@mipmap/test" />

            <TextView
                android:id="@+id/mTv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="jkjlkjkljslkdjfklsjdfkljsdlkjfkljsdlkfj"
                />
        </LinearLayout>
    </ScrollView>


    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/mIvBarView"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:alpha="0"
            android:scaleType="centerCrop"
            android:src="@mipmap/test"
            android:visibility="visible" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <View
                android:id="@+id/mTopView"
                android:layout_width="match_parent"
                android:layout_height="0dp" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/mToolBar"
                android:layout_width="match_parent"
                android:layout_height="?actionBarSize"
                app:title="图片标题栏滑动变化"
                app:titleTextColor="@android:color/white" />

        </LinearLayout>
    </FrameLayout>
</FrameLayout>
2.2 设置状态栏透明
ImmersionBar.with(this).titleBar(mToolBar).init()


override fun onDestroy() {
    super.onDestroy()
    ImmersionBar.with(this).destroy()
}
2.3 将标题图片上移至状态栏+标题栏高度的底部部位
 //将标题图片上移至状态栏+标题栏高度的底部部位
val params = mIvBarView.getLayoutParams()
//状态栏+标题栏的高度
var topHeight = mToolBar.layoutParams.height + getStatusHeight()

val ivTitleHeadBgParams = mIvBarView.getLayoutParams() as ViewGroup.MarginLayoutParams
val marginTop = params.height - topHeight
ivTitleHeadBgParams.setMargins(0, -marginTop, 0, 0)
2.4 设置滑动监听,控制背景图片的透明度
//监听滑动状态设置透明度
mScrollView.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
    var headHight = mIvHeadView.layoutParams.height
    var flagHight = headHight - topHeight
    var alpha = 0f
    var scrolledY = if (scrollY < 0) 0 else scrollY

    if (flagHight > 0) {
       if (scrolledY < flagHight) {
           alpha = scrolledY.toFloat() / flagHight
        } else {
           alpha = 1f
        }
    }
    mIvBarView.alpha = alpha
}

参考资料

源码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,116评论 25 708
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,869评论 2 59
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,004评论 3 119
  • 四月飞雪,你嗅着樱花,一脸陶醉 芳香顺风飘来,宛若撩人的彩带 一眨眼,你消失在一片洁白 如烟雾一般,将人欺骗后狼狈...
    April石阅读 340评论 9 23
  • 因為看了一篇回顧自己10年前的因果文章 我想到自己18歲的時候,用爸爸買的機車騎車上高中 盲目跟著學校讀讀書,寫寫...
    寫字的人阅读 156评论 0 1