适配“沉浸式”状态栏

article/2025/8/24 3:59:17

传送门:
fitSystemWindow属性的作用
http://blog.csdn.net/wangxp423/article/details/79564244
fitSystemWindow属性实战
http://blog.csdn.net/wangxp423/article/details/79566465


上两篇我们讲了fitSystemWindows实现沉浸式状态栏,本篇主要讲解适配“沉浸式”状态栏

一,白色底标题栏情况下的沉浸式状态栏

白底状态栏
前两个图分别是5.0,6.0.1系统下沉浸式状态栏情况下,如果标题栏是白色底的显示效果,很明显不是我们想要的效果。图三才是我们想要的。

二,修改状态栏字体图标颜色

如果遇到浅色底的标题栏+沉浸式状态栏,就会如上图看不到状态栏里面的字体和图标。这个时候我们需要改变状态栏字体和图标颜色,但是改变标题栏字体图标颜色只支持6.0+以上系统,小米和魅族也提供有相应的方法。

   /*** 修改状态栏字体颜色只能在android6.0以上原生系统中,同时小米和魅族提供有方法,其他厂商可能无效过* 设置Android状态栏的字体颜色,状态栏为亮色的时候字体和图标是黑色,状态栏为暗色的时候字体和图标为白色** @param dark 状态栏字体和图标是否为深色*/protected void setStatusBarTextDark(boolean dark) {if (OsUtil.isMIUI()){// 小米MIUItry {Window window = getWindow();Class clazz = getWindow().getClass();Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");int darkModeFlag = field.getInt(layoutParams);Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);if (dark) {    //状态栏亮色且黑色字体extraFlagField.invoke(window, darkModeFlag, darkModeFlag);} else {       //清除黑色字体extraFlagField.invoke(window, 0, darkModeFlag);}} catch (Exception e) {e.printStackTrace();}return;}if (OsUtil.isFlyme()){// 魅族FlymeUItry {Window window = getWindow();WindowManager.LayoutParams lp = window.getAttributes();Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");darkFlag.setAccessible(true);meizuFlags.setAccessible(true);int bit = darkFlag.getInt(null);int value = meizuFlags.getInt(lp);if (dark) {value |= bit;} else {value &= ~bit;}meizuFlags.setInt(lp, value);window.setAttributes(lp);} catch (Exception e) {e.printStackTrace();}return;}// android6.0+系统if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (dark) {getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);} else {getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);}}}

三,主流APP6.0以下适配效果

这里写图片描述

从左到右,分别是:掘金,今日头条,简述关于5.0系统以下白色底标题栏的适配效果。
其实“沉浸式”状态栏,就是状态栏透明,标题栏显示在状态栏下面,我们也知道,状态栏属于系统window,拥有最高显示层级,会显示在最顶层。所以我们在适配的时候有两种方案,一种是修改状态栏的颜色,如果白色标题栏的时候修改状态栏颜色为浅灰色,另一种就是,在标题栏上层添加一个跟状态栏同高的灰色view来达到适配的效果。
我们可以看到掘金和简书是采用的第一种方案,今日头条采用的第二种方案。下面我们将分别讲述两种方案的适配。

四,修改状态栏颜色进行适配

    /*** 根据版本不同设置状态栏颜色不同* 适适配白底标题栏(方案一)改变状态栏字体颜色* 适配方案1, 4.4以下的不适配,4.4-5.0的也不适配,5.0-6.0修改状态栏颜色为浅灰色,6.0以上修改状态栏字体颜色* 因为修改状态栏颜色5.0以上才支持,所以5.0以下的不适配** @param isLight 标题栏颜色是否为浅色(白色)*/protected void setColorStatusBar(boolean isLight, int statsBarcolor) {if (OsUtil.isMIUI() || OsUtil.isFlyme() || Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {setStatusBarTextDark(isLight);} else {Window window = getWindow();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0以上//兼容5.0 状态栏半透明情况, 貌似并没有什么卵用(机型锤子T2 5.0系统)(跟厂商定制有关原生有用)window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(statsBarcolor);} else { //4.4-5.0 以及 4.4以下//这是一个开源库,支持4.4以上修改状态栏颜色 这里我就不适配了
//                compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
//                SystemBarTintManager tintManager = new SystemBarTintManager(activity);
//                tintManager.setStatusBarTintEnabled(true);
//                tintManager.setStatusBarTintResource(colorId);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}}}

适配效果图如下,从左到右依次是4.3,4.4.4,5.1.小米6.0.1系统的适配效果
这里写图片描述

五,在标题栏上方添加View进行适配

如下代码封装一个适配基类Activity

package com.xp.exercise.statsbar.base;import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;import com.xp.exercise.R;
import com.xp.exercise.statsbar.util.OsUtil;/*** @类描述:适配白底标题栏(方案二)顶部添加View,改变View颜色。 基类*/
public class CompatStatusBarActivity extends StatusBarBaseActivity {private FrameLayout mFrameLayoutContent;private View mViewStatusBarPlace;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_compat_status_bar);mViewStatusBarPlace = findViewById(R.id.view_status_bar_place);mFrameLayoutContent = (FrameLayout) findViewById(R.id.frame_layout_content_place);ViewGroup.LayoutParams params = mViewStatusBarPlace.getLayoutParams();params.height = getStatusBarHeight();mViewStatusBarPlace.setLayoutParams(params);}@Overridepublic void setContentView(@LayoutRes int layoutResID) {//这里能够看到 我们这里其实是一个适配基类。布局中增加了一个View 用来适配状态栏的高度并调整颜色//contentLayout会将继承自这个Activity的页面的layout添加进去以达到通用的目的View contentView = LayoutInflater.from(this).inflate(layoutResID, null);mFrameLayoutContent.addView(contentView);}/*** 根据版本不同 修改添加View的颜色* 适配白底标题栏(方案二)顶部添加View,改变View颜色* 适配方案2, 4.4以下的不适配,4.4-6.0修改View颜色为浅灰色,6.0以上修改View颜色为白色,修改状态栏字体颜色** @param isLight 标题栏颜色是否为浅色(白色)*/protected void setViewColorStatusBar(boolean isLight, int statusBarPlaceColor) {//6.0+ 小米 魅族 可以直接适配 一般情况下6.0以上都是透明if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M || OsUtil.isMIUI() || OsUtil.isFlyme()) {setStatusBarTextDark(isLight);setStatusBarPlaceColor(statusBarPlaceColor);} else {if (statusBarPlaceColor == Color.WHITE) {statusBarPlaceColor = 0xffcccccc;}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //4.4以上修改为浅灰色setStatusBarPlaceColor(statusBarPlaceColor);} else { //4.4以下不适配setStatusBarPlaceVisible(false);}}}protected void setStatusBarPlaceVisible(boolean isVisible){if (isVisible){mViewStatusBarPlace.setVisibility(View.VISIBLE);} else{mViewStatusBarPlace.setVisibility(View.GONE);}}protected void setStatusBarPlaceColor(int statusColor) {if (mViewStatusBarPlace != null) {mViewStatusBarPlace.setBackgroundColor(statusColor);}}
}

布局文件代码如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><View
        android:id="@+id/view_status_bar_place"android:layout_width="match_parent"android:layout_height="25dp" /><FrameLayout
        android:id="@+id/frame_layout_content_place"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

适配效果如下从左到右分别是4.3,4.4.4,5.1,小米6.0.1系统
这里写图片描述

其实代码很少,下面上源码在(StatusBar研究)里面,欢迎交流
https://github.com/wangxp423/ViewExercise

参考:https://www.jianshu.com/p/a44c119d6ef7


个人公众号“Code之旅”
这里写图片描述
欢迎扫码关注个人公众号“Code之旅”

个人gitHub地址:https://github.com/wangxp423


http://chatgpt.dhexx.cn/article/xxWXOjjK.shtml

相关文章

Android 实现沉浸式状态栏(包含顶部栏吸顶Layout CoordinatorLayout实现沉浸式状态栏)

前言 Android状态栏默认是固定的黑底白字&#xff0c;这肯定是不被伟大的设计师所喜爱的&#xff0c;更有甚者&#xff0c;某些时候设计希望内容能够延伸到状态栏上部&#xff08;例如顶部是大图的情况&#xff09;。所幸的是随着Android版本的迭代&#xff0c;开发者对状态栏…

Android实现ImmersionBar沉浸式状态栏

&#xff08;一&#xff09;效果图 &#xff08;二&#xff09;实现步骤&#xff1a; 1、在build.gradle中加上 implementation com.gyf.barlibrary:barlibrary:2.3.0 2、设置页面为全屏 将上图中的 <style name"AppTheme" parent"Theme.AppCompat.Light.…

Android沉浸式状态栏实现

首先创建一个BaseActivity或者BaseFragment&#xff0c; 后面需要沉浸式状态的继承BaseActivity或BaseFragment, 然后在XML文件中添加想设置的状态栏背景颜色&#xff0c;以下两句代码 android:background"#1677FE" android:fitsSystemWindows“true” BaseActivity代…

一个Android沉浸式状态栏上的黑科技

本文同步发表于我的微信公众号&#xff0c;扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注&#xff0c;每个工作日都有文章更新。 说起来&#xff0c;在不知不觉中&#xff0c;我竟然凑成了这沉浸式状态栏三部曲。 其实最开始的时候&#xff0c;我主要是因为工作上的原因想…

Android 实现沉浸式状态栏

上一篇文章将Android 实现变色状态栏我们实现了变色的状态栏&#xff0c;也介绍了沉浸式状态栏和透明状态栏的区别&#xff0c;这篇文章我们实现沉浸式状态栏。 沉浸式状态栏的来源就是很多手机用的是实体按键&#xff0c;没有虚拟键&#xff0c;于是开了沉浸模式就只有状态栏消…

Android 沉浸式状态栏攻略 让你的状态栏变色吧

转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/48649563&#xff1b; 本文出自:【张鸿洋的博客】 一、概述 近期注意到QQ新版使用了沉浸式状态栏&#xff0c;ok&#xff0c;先声明一下&#xff1a;本篇博客效果下图&#xff1a; 关于这个状…

Android 最新实现沉浸式状态栏的效果

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家&#xff0c; &#x1f449;点击跳转到网站 什么是状态栏: 是指手机屏幕最顶上&#xff0c;显示中国移动、安全卫士、电量、网速等等&#xff0c;在手…

Android 沉浸式状态栏完美解决方案

国内很多类似的文章, 我只想说一个字, 真tm乱! 我看不懂… 评论里面 全在说无效什么的 (我试了也无效, 好厉害的样子) 不废话,回到正题, 首先贴上一个众所周知的库 SystemBarTint 我只要这个类 https://github.com/jgilfelt/SystemBarTint/blob/master/library/src/com/readys…

Android---沉浸式状态栏

Android—沉浸式状态栏 我们的征程是星辰大海&#xff0c;而非人间烟尘 文章目录 Android---沉浸式状态栏去掉标题栏效果 引入依赖沉浸状态栏颜色沉浸状态栏图片 去掉标题栏 首先去掉对应主题下面的Android自带的ActionBar&#xff0c;只需要在对应主题下面加NoActionBar 效果 …

史上最完美的Android沉浸式状态导航栏攻略

前言 最近我在小破站开发一款新App&#xff0c;叫高能链。我是一个完美主义者&#xff0c;所以不管对架构还是UI&#xff0c;我都是比较抠细节的&#xff0c;在状态栏和导航栏沉浸式这一块&#xff0c;我还是踩了挺多坑&#xff0c;费了挺多精力的。这次我将我踩坑&#xff0c…

Android设置“沉浸式状态栏”的方法

Android系统界面构成 Android系统界面由状态栏、ActionBar和导航栏组成&#xff0c;如下图所示&#xff1a; “沉浸式状态栏”的界面显示效果 沉浸式状态栏&#xff0c;或叫“透明状态栏”&#xff0c;显示效果如下图所示&#xff1a; 实现沉浸式状态栏的步骤 一、添加StatusB…

Android沉浸式状态栏(透明系统状态栏)

Android沉浸式状态栏&#xff08;透明系统状态栏&#xff09;的目的&#xff1a;顶部系统状态栏和App的导航栏一体化&#xff0c;不给用户突兀的感觉&#xff0c;使用户把更多的视角留在我们的App上。 沉浸式状态栏的兼容情况 Android版本透明状态栏<4.44.4-5.0✓>5.0✓…

沉浸式状态栏

沉浸式状态栏 简单介绍 沉浸式状态栏其实是对沉浸模式(Immersive Mode)在状态栏上的体现,即让状态栏变透明,或者是在打游戏和看视频时彻底隐藏起状态栏,让用户拥有良好的体验。 比如说我们看视频,状态栏隐藏后视频的观看会更加完整,下图就是看视频时的截图,可以看到当…

Android沉浸式状态栏,看完这篇就够了!

背景 之前做过Android沉浸式状态栏的相关需求&#xff0c;但是一直忙于工作&#xff0c;没时间系统的整理下沉浸式相关的知识&#xff0c;所以今天抽出时间&#xff0c;写一篇 Android沉浸式状态栏的文章。 何为沉浸式 沉浸式就是要给用户提供完全沉浸的体验&#xff0c;使用…

图片预览与下载

后端返回base64进行图片的预览和下载下载 有一个图片预览的接口。后端返回的值长这个样子 1、预览 如果要在线预览的话&#xff0c;代码需要这样写放入img的src this.imgPreviewBaseUrl data:image/png;base64, res.data标签中就是这样的 2、下载 图片预览的这样的返…

vue 实现图片预览

vue实现图片预览 现在很多的项目里面图片展示缩略图,然后点击实现图片预览,放大的功能 最近我的项目里面就遇见了这么个场景,我选用了插件进行处理 下面说下实现步骤 1、首先安装插件 npm install vue-photo-preview --save插件地址 2、在main.js里面引入,全局使用 impor…

图片预览器

此预览器&#xff0c;一次只能翻页十张图片&#xff0c;开发人员可根据自己需要&#xff0c;修改前台代码。 页面代码 <% Page Language"C#" AutoEventWireup"true" CodeBehind"UpFilesAndPreview.aspx.cs" Inherits"WebFramework.Comm…

v-viewer图片预览

安装 npm install v-viewer引入 import Viewer from v-viewer import viewerjs/dist/viewer.css Vue.use (Viewer, {defaultOptions: {navbar: true,toolbar: false,movable: false,title: false,zoomable: true,scalable: true,transition: true} })使用 方法一&#xff1a…

vue2图片预览插件

文章目录 学习链接准备工作准备图片与基础的样式PrevImg.vueApp.vue静态效果 封装插件修改PrevImg.vue定义插件逻辑main.js中应用此插件App.vue中使用此插件 图片预览列表修改App.vue修改插件逻辑修改PrevImg.vue 学习链接 vue插件开发实例-图片预览插件 vue2-pre-img-plugin的…

vue 图片预览插件

vue 图片预览插件 步骤 1、先安装依赖 npm install v-viewer --save2、main.js内引用并注册调用 //main.js import Viewer from v-viewer import viewerjs/dist/viewer.cssVue.use(Viewer); Viewer.setDefaults({Options: { "inline": true, "button": …