公司项目UI改版的时候,把大部分标题栏都设计成了白色,给我们的设计图是这个样子的:

设计图.png

这状态栏布局和图标挺像Android,但是这白底黑字Android设计规范里可没有啊,于是我们开发的时候果断忽视这个状态栏了。

结果设计师拿着测试版过来问,你们安卓这个状态栏颜色怎么没改啊。

我:这个做不了。

设计师一脸质疑。

我:Android4.4以上系统版本可以修改状态栏颜色,但是只有小米的MIUI、魅族的Flyme和Android6.0以上系统可以把状态栏文字和图标换成深色,其他的系统状态栏文字都是白色的,换成浅色背景的话就看不到了。

设计师一脸懵逼不知所云。

后来看着这黑色状态栏白色标题栏实在难看,而且自己用的是MIUI,于是还是做了适配。

其实很多国内三方Android系统都有深色状态栏字体模式,但是目前只看到了小米和魅族公开了各自的实现方法,小米的支持MIUI V6以上版本,魅族的支持Flyme4.0以上版本。代码如下:

/*** 设置状态栏图标为深色和魅族特定的文字风格,Flyme4.0以上* 可以用来判断是否为Flyme用户* @param window 需要设置的窗口* @param dark 是否把状态栏字体及图标颜色设置为深色* @return  boolean 成功执行返回true**/
public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {boolean result = false;if (window != null) {try {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);result = true;} catch (Exception e) {}}return result;
}/*** 设置状态栏字体图标为深色,需要MIUIV6以上* @param window 需要设置的窗口* @param dark 是否把状态栏字体及图标颜色设置为深色* @return  boolean 成功执行返回true**/
public static boolean MIUISetStatusBarLightMode(Window window, boolean dark) {boolean result = false;if (window != null) {Class clazz = window.getClass();try {int darkModeFlag = 0;Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");Field  field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");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);//清除黑色字体}result=true;}catch (Exception e){}}return result;
}

MIUI深色状态栏字体模式.png

Flyme深色状态栏字体模式.png

官方在Android6.0中提供了亮色状态栏模式,配置只需一行代码:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}

6.0原生深色状态栏字体模式.png

网上有关状态栏颜色设置的文章很多,下面这段代码是我用的状态栏设置工具类,算是一个总结吧。

官方在4.4版本只提供了状态栏透明的api,大家普遍采用开源库SystemBarTint对4.4版本状态栏颜色进行设置,请各位自行下载。

在设置状态栏全透明后,整个activity布局都会上移充满整个屏幕,如果你不想让布局上移的话就需要在根布局设置

   android:fitsSystemWindows="true"

以下为我的状态栏设置工具类:

/*** Created by 赵晨璞 */
public class StatusBarUtil {/*** 修改状态栏为全透明* @param activity*/
@TargetApi(19)
public static void transparencyBar(Activity activity){if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = activity.getWindow();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(Color.TRANSPARENT);} elseif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {Window window =activity.getWindow();window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}
}/*** 修改状态栏颜色,支持4.4以上版本* @param activity* @param colorId*/
public static void setStatusBarColor(Activity activity,int colorId) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = activity.getWindow();
//      window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);    window.setStatusBarColor(activity.getResources().getColor(colorId));} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明transparencyBar(activity);SystemBarTintManager tintManager = new SystemBarTintManager(activity);tintManager.setStatusBarTintEnabled(true);tintManager.setStatusBarTintResource(colorId);}
}/***设置状态栏黑色字体图标,* 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android* @param activity* @return 1:MIUUI 2:Flyme 3:android6.0*/
public static int StatusBarLightMode(Activity activity){int result=0;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {if(MIUISetStatusBarLightMode(activity.getWindow(), true)){result=1;}else if(FlymeSetStatusBarLightMode(activity.getWindow(), true)){result=2;}else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);result=3;}}return result;
}/*** 已知系统类型时,设置状态栏黑色字体图标。* 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android* @param activity* @param type 1:MIUUI 2:Flyme 3:android6.0*/
public static void StatusBarLightMode(Activity activity,int type){if(type==1){MIUISetStatusBarLightMode(activity.getWindow(), true);}else if(type==2){FlymeSetStatusBarLightMode(activity.getWindow(), true);}else if(type==3){activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}}/*** 清除MIUI或flyme或6.0以上版本状态栏黑色字体*/
public static void StatusBarDarkMode(Activity activity,int type){if(type==1){MIUISetStatusBarLightMode(activity.getWindow(), false);}else if(type==2){FlymeSetStatusBarLightMode(activity.getWindow(), false);}else if(type==3){activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);}}/*** 设置状态栏图标为深色和魅族特定的文字风格* 可以用来判断是否为Flyme用户* @param window 需要设置的窗口* @param dark 是否把状态栏字体及图标颜色设置为深色* @return  boolean 成功执行返回true**/
public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {boolean result = false;if (window != null) {try {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);result = true;} catch (Exception e) {}}return result;
}/*** 设置状态栏字体图标为深色,需要MIUIV6以上* @param window 需要设置的窗口* @param dark 是否把状态栏字体及图标颜色设置为深色* @return  boolean 成功执行返回true**/
public static boolean MIUISetStatusBarLightMode(Window window, boolean dark) {boolean result = false;if (window != null) {Class clazz = window.getClass();try {int darkModeFlag = 0;Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");Field  field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");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);//清除黑色字体}result=true;}catch (Exception e){}}return result;
}}

适配浅色状态栏深色字体的时候发现底层版本为Android6.0.1的MIUI7.1系统不支持View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR设置,还是得用MIUI自己的深色字体方法。

三方Android系统对底层改的挺乱的,也是让人头痛。O__O


神马?写了这么多,你就说了句图里的妹子挺好看的。。。

图片是随手从网上找的。。。

如果你觉得本文有点用处或是觉得我找的这张图不错就请随手点个赞吧。。。

白底黑字!Android浅色状态栏黑色字体模式相关推荐

  1. 白底黑子android菜单栏,白底黑字状态栏(详细使用步骤及各机型测试结果)

    前言 我个人比较喜欢黑白搭的风格,显得简约.文艺. 说到Android白底黑字状态栏.都会看到过这篇文章白底黑字!Android浅色状态栏黑色字体模式,这也是我最喜欢的一篇文章.(感觉是技术与美貌并存 ...

  2. matlab 画图 白底黑字,白底黑字状态栏(详细使用步骤及各机型测试结果)

    前言 我个人比较喜欢黑白搭的风格,显得简约.文艺. 说到Android白底黑字状态栏.都会看到过这篇文章白底黑字!Android浅色状态栏黑色字体模式,这也是我最喜欢的一篇文章.(感觉是技术与美貌并存 ...

  3. android白色字体代码,Android实现状态栏白底黑字效果示例代码

    前言 本文主要给大家介绍了关于Android如何实现状态栏白底黑字的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.描述 在项目中有的时候Ui设计状态栏背景颜色是白色的 ...

  4. Android设置白底黑字状态栏(已适配Flyme和新旧版MIUI)

    Android默认深主题色白字状态栏,这跟浅色的界面实在是不搭,那就改成黑字,底色随便改. 在Android6.0以前,这事不好办,所以MIUI自己实现了一个方法供开发者使用,Flyme也有(不知道是 ...

  5. Android设置状态栏为白底黑字

    在开发过程中可能会有将状态栏设置成白底黑字的样式,但是Android系统只有在4.4之上才可以修改状态栏颜色,想要设置状态栏为黑字,只有在Android6.0以上系统或者小米的MIUI V6以上版本或 ...

  6. 关于Android状态栏反色(白底黑字)的适配小总结

    我尽量不打错别字,用词准确,不造成阅读障碍. 昨天在OPPO开发者后台清理未读消息时看到一篇介绍状态栏反色(白底黑字)的文章,心血来潮看了一下,然后就查阅了国内各个ROM的不同处理方式,写一篇小总结, ...

  7. android状态栏白色,Android如何实现状态栏白底黑字效果

    Android如何实现状态栏白底黑字效果 发布时间:2021-04-16 12:28:10 来源:亿速云 阅读:77 作者:小新 这篇文章给大家分享的是有关Android如何实现状态栏白底黑字效果的内 ...

  8. Android StatusBar 状态栏白底黑字设置

    项目中的一个场景UI要求使用白底黑字,并且白底要与大背景的颜色保持一致.需求很简单,可能我们的第一反应就是沉浸式或全屏模式,但这个场景中的某些操作又使得不能使用沉浸式或全屏模式.所以,我们必须用其他方 ...

  9. Android界面全屏适配7.0、动态修改状态栏颜色、浅色状态栏深色字体

    https://www.jianshu.com/p/e93787e23d3b 在需要置顶的界面添加主题TopTheme 为了适配要创建多个value文件夹,名称不能错 styles.xml <! ...

最新文章

  1. 20150411--Dede二次开发-01
  2. 边缘计算对于工业物联网的重要性
  3. redis 导出导入详解
  4. 互联网金融2.0 这是最好的时代
  5. 用正则表达式匹配网址URL中最后一个反斜杠/后面的内容
  6. MySQL 主从复制原理及搭建
  7. 使用关键字SCAN ABAP-SOURCE对ABAP源代码进行语法扫描
  8. 搜索引擎的十大秘密(收藏)
  9. Android运行时异常 couldn't find xx.so
  10. 笔记本电脑风扇声音大怎么办_车子才开几年发动机就发出哒哒哒的声音怎么办?不一定是大问题_搜狐汽车...
  11. WinAPI: midiOutSetVolume - 设置 MIDI 输出设备的音量
  12. JQuery获得绝对,相对位置的坐标方法
  13. android记账本流程图,记账的基本流程
  14. 我的世界服务器无限矿区块指令,我的世界区块刷新指令 | 手游网游页游攻略大全...
  15. 文后参考文献著录规则 自动生成器 HTML
  16. mac上的android模拟器下载安装,Mac电脑上安装安卓模拟器,Mac如何安装Android模拟器...
  17. [软件更新]vidalia 0.2.0.32
  18. Web前端jQuery实现监控大屏数字滚动
  19. js如何实现侧边广告_如何用稳定器轻松实现低成本的商业级广告片制作?
  20. 宁波市教育学院计算机系主任,欢迎宁波诺丁汉大学计算机系主任白瑞斌教授一行到访南科大...

热门文章

  1. 丰睿佳业电商:抖音小店开通条件是什么?
  2. 怎么提高与客户沟通的技巧
  3. 解说Solder Mask 和Paste Mask 区别
  4. 力扣239. 滑动窗口最大值(自定义排序队列)
  5. STM32F030 HAL库硬件SPI操作W25Q16存储芯片(二)
  6. css实现16:9的图片比例
  7. 快手三面(Java岗位),offer已拿,面试官都问了些啥?
  8. 自动化测试之数据库测试
  9. 工业相机CCD镜头选型公式
  10. access与python哪个好_美图太多,Python 帮你挑选最合适的!