安卓android一种沉溺式状态栏和导航栏并可设置突变和图片的办法

介绍

网络上撒播的状态栏导航栏沉溺的方式有很多,但是在我运用的时分都失效了,在官网也没找到适宜的比方达到期望,依据状况判断是因为现在版本过新和系统有联系。 也许是自己太菜的原因。 然后就后边自己探索出来的一种方式,在亲身运用有效后在这儿记载一下。 先列出现在我运用的相关版本:


gradle plugin version: 7.2.1
gradle version: 7.3.3
android studio version: Chipmunk 2021.2.1
compileSdk 32
targetSdk 32

过程

这儿仍是大略记载一下过程,成果在最后边。

首先,放出刚开始的界面状况:

安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

然后是根本的配色,便利比照成果:


<style name="Colors" parent="Theme.Material3.DayNight">
    <!--根本配色,@color就不放了,自己之后随意替换一些色彩就好-->
    <item name="colorPrimary">#1193C2</item>
    <item name="colorPrimaryVariant">#02719F</item>
    <item name="colorOnPrimary">@color/white</item>
    <item name="colorSecondary">@color/pink_3</item>
    <item name="colorSecondaryVariant">@color/pink_2</item>
    <item name="colorOnSecondary">@color/black</item>
    <item name="android:statusBarColor">@color/blue_1</item>
    <item name="android:navigationBarColor">@android:color/white</item>
</style>

沉溺系统栏的话,通明是必不可少的,在这儿也要把默许ActionBar禁用换成ToolBar,这儿便是先设置好主题为通明主题:


<style name="NoActionBarAndTransparent" parent="Colors">
    <!--这儿不能运用直接设置通明色彩的,要用那个window色彩的,否则导航栏色彩会没法改动到-->
    <!--        <item name="android:statusBarColor">@android:color/transparent</item>-->
    <!--        <item name="android:navigationBarColor">@android:color/transparent</item>-->
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <!--        <item name="android:windowDrawsSystemBarBackgrounds">true</item>-->
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

这儿放出布局:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_layout_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/main_appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/main_toolbar"
            style="@style/Widget.MaterialComponents.Toolbar.Primary"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:title="沉溺测验" />
    </com.google.android.material.appbar.AppBarLayout>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/main_recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/main_appbar" />
</RelativeLayout>

成果图如下,状态栏和导航栏通明算是完成了,至于toolBar的色彩只需要设置background通明就好。

安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

在appBar和toolBar上加:android:background="@android:color/transparent",就能获得全白的界面(因为文字也是白色),好吧toolBar属性再加上一个app:titleTextColor="@color/black"。 得到如下成果:

安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

这时分通明作业现已完成,剩余的便是着色?差不多吧。

这儿放到一个办法里,名字随意,就暂定underBar这样,主要用到的便是这个window.setBackgroundDrawable


fun underBar(activity: Activity) {
    //暂时设置为亮灰色看看状况
    activity.window.setBackgroundDrawable(ColorDrawable(Color.LTGRAY))
}

在需要的地方调用,比方activity的onCreate()中,看效果:

安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

界面全部变成灰色了,沉溺嘛,不至于主要界面色彩也跟着沉溺了,这样布景设置个图片状况就很怪了:


//改动下办法
fun underBar(activity: Activity, drawable: Drawable) {
    activity.window.setBackgroundDrawable(drawable)
}

//调用
underBar(activity, AppCompatResources.getDrawable(activity, R.drawable.ic_background)!!)

成果:

安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

优化下办法,让主要内容部分仍是本来的色彩。此外,暗色图片导致界面内容色彩不明显了,换个亮色的吧。

安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

这儿涉及到改动相关内容字体色彩啊什么的,还有这样运用的布景图片有变形的或许,能够通过获取屏幕宽高来裁切个布景就好,这儿只提供个思路,或许会用到,到时分再说,扯远了。


//改动下办法,多了个内容View,就中心那块
fun underBar(
    activity: Activity,
    drawable: Drawable,
    contentView: View
) {
    val old = activity.window.decorView.background
    activity.window.setBackgroundDrawable(drawable)
    contentView.background = old
}

//调用,这儿用了viewBinding所以能够这样传,怎么用能够看前面发过的有个MVVM运用笔记里边有
underBar(
    activity,
    AppCompatResources.getDrawable(activity, R.drawable.ic_background)!!,
    bind.mainRecycler
)

成果:

安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

到这儿,效果根本上仍是没问题了,至于突变色,只需要新建一个shape,来个比方,名字为shape_background.xml,没毛病:


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--angle:旋转度数-->
    <gradient
        android:angle="0"
        android:endColor="#FF626E"
        android:startColor="#FFBE71" />
</shape>

//调用,改一个布景参数
underBar(
    activity,
    AppCompatResources.getDrawable(activity, R.drawable.shape_background)!!,
    bind.mainRecycler
)

成果:

安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

结束

  1. 设置主题通明并换成toolBar,其实默许actionBar也行,就改成通明布景罢了,所以用的时分看状况喽:

    
    <style name="NoActionBarAndTransparent" parent="Colors">
        <!--这儿不能运用直接设置通明色彩的,要用那个window色彩的,否则导航栏色彩会没法改动到-->
        <!--        <item name="android:statusBarColor">@android:color/transparent</item>-->
        <!--        <item name="android:navigationBarColor">@android:color/transparent</item>-->
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <!--        <item name="android:windowDrawsSystemBarBackgrounds">true</item>-->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
    
  2. 代码:

    
    //改动下办法,多了个内容View,就中心那块
    fun underBar(
        activity: Activity,
        drawable: Drawable,
        contentView: View
    ) {
        val old = activity.window.decorView.background
        activity.window.setBackgroundDrawable(drawable)
        contentView.background = old
    }
    
  3. 调用:

    
    //调用,这儿用了viewBinding所以能够这样传,怎么用能够看前面发过的有个MVVM运用笔记里边有
    underBar(
        activity,
        AppCompatResources.getDrawable(activity, R.drawable.ic_background)!!,
        bind.mainRecycler
    )
    

有帮助到you无妨赞赞俺,谢谢。