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

2023-05-16

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

介绍

网络上流传的状态栏导航栏沉浸的方式有很多,但是在我使用的时候都失效了,在官网也没找到合适的例子达到期望,根据情况判断是由于目前版本过新和系统有关系。
也许是自己太菜的缘故。
然后就后面自己摸索出来的一种方式,在亲身使用有效后在这里记录一下。
先列出目前我使用的相关版本:


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

过程

这里还是粗略记录一下过程,结果在最后面。

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

f6fd1268c8f3

然后是基本的配色,方便对比结果:


<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透明就好。

b9e336b6c41de76a

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

15c588e84e8eb99b

这时候透明工作已经完成,剩下的就是着色?差不多吧。

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


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

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

a85ddb283437e8ed

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


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


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

结果:

fbefcffc8871c250

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

ba599ad172bbb01a

这里涉及到改变相关内容字体颜色啊什么的,还有这样使用的背景图片有变形的可能,可以通过获取屏幕宽高来裁切个背景就好,这里只提供个思路,可能会用到,到时候再说,扯远了。


//改变下方法,多了个内容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
)

结果:

3be25276fa7dfb50

到这里,效果基本上还是没问题了,至于渐变色,只需要新建一个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
)

结果:

ea4487bb79a5a2e3

结束

  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不妨赞赞俺,谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Android - 保存动态更改布局的状态

    我有一个布局 用户可以在其中添加按钮并将其放置在他们想要的位置 我想允许用户保存他们的布局 以便下次打开应用程序时加载它 有谁知道我是否可以将文件保存到 SD 卡上 或者 我可以使用某种layout getXml 方法并将其放入我的应用程序
  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • Android - 如何一次只允许播放一个 MediaPlayer 实例?

    我正在尝试创建一个简单的 Sound board Android 应用程序 使用 ListView 项目作为按钮 顺便说一句 我是一个新手程序员 我的想法是 我按下一个按钮 就会播放一个特定的声音文件 如果我在播放声音时按下任何按钮 它应该
  • 如何更新 Firebase 中的节点密钥?

    如何重命名14 04 2017 node 没有用于重命名节点的 API 您必须获取节点的值 使用新名称将其保存到数据库并删除旧节点
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • 共同的偏好不断消失

    我正在使用共享首选项来存储我的应用程序的登录凭据 除了一个用户之外 一切正常 一段时间后 共享偏好似乎会以某种方式重置或清除 我已针对该用户调整了我的应用程序 使其不再清除他的共享偏好设置 这样我就可以确定这不是我的应用程序的错 但即使在这
  • KitKat(及更低版本)设备上的 Android Material Design

    我将在我们学校开发一个 Android 应用程序作为一个项目 我想使用 Google 的新 Material Design 但我知道它仅适用于 Android L 设备 Jack Underwood 最近发布了名为 Today Calend
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • Android 原理图内容提供程序库配置?

    Jake Wharton 在最近的一次演讲中提到了这个库 它看起来是避免大量样板文件的好方法 所以我尝试了一下 但没有任何成功 https github com SimonVT schematic https github com Simo
  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo
  • 带有自定义阵列适配器的微调器不允许选择项目

    我使用自定义阵列适配器作为微调器 但是 当在下拉列表中选择一个项目时 下拉列表保留在那里 并且微调器不会更新 这是错误行为 与使用带有字符串的通用数组适配器相比 这是自定义类 我错过了什么吗 谢谢 public class Calendar
  • Android 启动器快捷方式

    我制作了一个简单的打卡 打卡时钟应用程序 我想向用户添加在主屏幕上创建快捷方式的选项 该快捷方式将切换应用程序的状态 超时 超时 但我根本不希望此快捷方式在屏幕上打开应用程序 这是我的 setupShortcut private void
  • Android相机意图:如何获取全尺寸照片?

    我正在使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • 在 Android 上按下电源按钮时,如何防止先调用 onDestroy() 再调用 onCreate()

    我正在记录每个 onCreate 和 onDestroy 调用 我发现 一旦我单击 Android 上的电源按钮 以及模拟器上的电源按钮 我的活动中就会拨打电话 gt onDestroy gt onCreate 这会杀死我的游戏 然后立即从
  • 当手机旋转(方向改变)时如何最好地重新创建标记/折线

    背景 开发一个使用 Android Google Map v2 的本机 Android 应用程序 使用android support v4 app FragmentActivity 在 Android v2 2 上运行 客观的 在更改手机方
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少
  • 在 Google 地图上绘制线条/路径

    我很长一段时间都在忙于寻找如何在 HelloMapView 中的地图上的两个 GPS 点之间画一条线 但没有运气 谁能告诉我该怎么做 假设我使用扩展 MapView 的 HelloMapView 我需要使用叠加层吗 如果是这样 我是否必须重

随机推荐