安卓android一种沉溺式状态栏和导航栏并可设置突变和图片的办法
介绍
网络上撒播的状态栏导航栏沉溺的方式有很多,但是在我运用的时分都失效了,在官网也没找到适宜的比方达到期望,依据状况判断是因为现在版本过新和系统有联系。 也许是自己太菜的原因。 然后就后边自己探索出来的一种方式,在亲身运用有效后在这儿记载一下。 先列出现在我运用的相关版本:
gradle plugin version: 7.2.1
gradle version: 7.3.3
android studio version: Chipmunk 2021.2.1
compileSdk 32
targetSdk 32
过程
这儿仍是大略记载一下过程,成果在最后边。
首先,放出刚开始的界面状况:
然后是根本的配色,便利比照成果:
<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通明就好。
在appBar和toolBar上加:android:background="@android:color/transparent"
,就能获得全白的界面(因为文字也是白色),好吧toolBar属性再加上一个app:titleTextColor="@color/black"
。
得到如下成果:
这时分通明作业现已完成,剩余的便是着色?差不多吧。
这儿放到一个办法里,名字随意,就暂定underBar这样,主要用到的便是这个window.setBackgroundDrawable
。
fun underBar(activity: Activity) {
//暂时设置为亮灰色看看状况
activity.window.setBackgroundDrawable(ColorDrawable(Color.LTGRAY))
}
在需要的地方调用,比方activity的onCreate()中,看效果:
界面全部变成灰色了,沉溺嘛,不至于主要界面色彩也跟着沉溺了,这样布景设置个图片状况就很怪了:
//改动下办法
fun underBar(activity: Activity, drawable: Drawable) {
activity.window.setBackgroundDrawable(drawable)
}
//调用
underBar(activity, AppCompatResources.getDrawable(activity, R.drawable.ic_background)!!)
成果:
优化下办法,让主要内容部分仍是本来的色彩。此外,暗色图片导致界面内容色彩不明显了,换个亮色的吧。
这儿涉及到改动相关内容字体色彩啊什么的,还有这样运用的布景图片有变形的或许,能够通过获取屏幕宽高来裁切个布景就好,这儿只提供个思路,或许会用到,到时分再说,扯远了。
//改动下办法,多了个内容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
)
成果:
到这儿,效果根本上仍是没问题了,至于突变色,只需要新建一个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
)
成果:
结束
-
设置主题通明并换成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>
-
代码:
//改动下办法,多了个内容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 )
有帮助到you无妨赞赞俺,谢谢。