Android实现状态栏白底黑字效果示例代码

前言

本文主要给大家介绍了关于Android如何实现状态栏白底黑字的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

一、描述

在项目中有的时候Ui设计状态栏背景颜色是白色的,虽然还挺好看,不过可坑了我们做程序的,需要对很多机型进行适配,此文章列举了兼容多个机型版本的状态栏方案。

二、状态栏

1 只要设置下面的代码即可,我是放在BaseActivtiy里面用的

StatusBarUtil.transparencyBar(this); //设置状态栏全透明
StatusBarUtil.StatusBarLightMode(this); //设置白底黑字

2 状态栏兼容类,直接Copy即可

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);

  } else if (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以上版本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, true)) {
    //小米
    result = 1;
   } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) {
    //魅族
    result = 2;
   } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    //6.0以上
    activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    result = 3;
   } else {
    //其他的都设置状态栏成半透明的,以下设置半透明是调用第三方的,根据个人需求更改
//    ImmersionBar.with(activity).statusBarDarkFont(true, 0.5f).init();
   }
  }
  return result;
 }

 /**
  * 设置状态栏图标为深色和魅族特定的文字风格
  * 可以用来判断是否为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 activity
  * @param dark  是否把状态栏文字及图标颜色设置为深色
  * @return boolean 成功执行返回true
  */
 public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) {
  boolean result = false;
  Window window = activity.getWindow();
  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;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
     //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上
     if (dark) {
      activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
     } else {
      activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
     }
    }
   } catch (Exception e) {

   }
  }
  return result;
 }
}

白底黑字

半透明效果

三、注意事项

在适配中,有遇到一个 华为EMUI3.1 的手机设置上后有出现一些异常问题,我看有的第三方库也有对这个版本单独进行处理,应该是有点问题,所以我在项目中就直接屏蔽了这个版本的适配。

四、相关资料

白底黑字!Android浅色状态栏黑色字体模式

五、总结

此文章的工具类是从其他地方Copy来,精简了一些没有用到的代码,如果需要其他代码的,从第四点的链接进入查看就好,这类代码都是Copy来Copy去的,也找不到原创在哪了。。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Android实现修改状态栏背景、字体和图标颜色的方法

    前言: Android开发,对于状态栏的修改,实在是不友好,没什么api可以用,不像ios那么方便.但是ui又喜欢只搞ios一套.没办法.各种翻源码,写反射.真的蛋疼. 需求场景: 当toolbar及状态栏需要为白色或浅色时(如简书),状态栏由于用的Light风格Theme,字体,图标也都是白色,会看不清.如果改变成黑色就很和谐了. 一.修改状态栏颜色: 改变状态栏颜色,可以看看这篇文章.传送门:实现状态栏(statusbar)渐变效果其实很简单 传送门实现的效果: 这种方法实现的状态栏变色,没

  • Android系统更改状态栏字体颜色

    随着时代的发展,Android的状态栏都不是乌黑一片了,在Android4.4之后我们可以修改状态栏的颜色或者让我们自己的View延伸到状态栏下面.我们可以进行更多的定制化了,然而有的时候我们使用的是淡色的颜色比如白色,由于状态栏上面的文字为白色,这样的话状态栏上面的文字就无法看清了.因此本文提供一些解决方案,可以是MIUI6+,Flyme4+,Android6.0+支持切换状态栏的文字颜色为暗色. 修改MIUI public static boolean setMiuiStatusBarDar

  • Android获取手机屏幕宽高、状态栏高度以及字符串宽高信息的方法

    本文实例讲述了Android获取手机屏幕宽高.状态栏高度以及字符串宽高信息的方法.分享给大家供大家参考.具体如下: 首先定义TextView对象commentText 获取文字的宽高: TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); textPaint.setTextSize(commentText.getTextSize()); textPaint.setColor(Color.WHITE); FontMetrics fo

  • Android实现状态栏白底黑字效果示例代码

    前言 本文主要给大家介绍了关于Android如何实现状态栏白底黑字的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.描述 在项目中有的时候Ui设计状态栏背景颜色是白色的,虽然还挺好看,不过可坑了我们做程序的,需要对很多机型进行适配,此文章列举了兼容多个机型版本的状态栏方案. 二.状态栏 1 只要设置下面的代码即可,我是放在BaseActivtiy里面用的 StatusBarUtil.transparencyBar(this); //设置状态栏全透明 StatusB

  • Android状态栏白底黑字的示例代码

    之前公司项目UI改版的时候,把大部分标题栏都设计成了白色,给我们的设计图是这个样子的: 设计图.png 这状态栏布局和图标挺像Android,但是这白底黑字Android设计规范里可没有啊,于是我们开发的时候果断忽视这个状态栏了(当时大部分用户还都是Android 4.4). 结果设计师拿着测试版过来问,你们安卓这个状态栏颜色怎么没改啊. 我:这个做不了. 设计师一脸质疑. 我:Android4.4以上系统版本可以修改状态栏颜色,但是只有小米的MIUI.魅族的Flyme和Android6.0以上

  • Android开发TextvView实现镂空字体效果示例代码

    记录一下... 自定义TextView public class HollowTextView extends AppCompatTextView { private Paint mTextPaint, mBackgroundPaint; private Bitmap mBackgroundBitmap,mTextBitmap; private Canvas mBackgroundCanvas,mTextCanvas; private RectF mBackgroundRect; private

  • Android自定义view仿QQ的Tab按钮动画效果(示例代码)

    话不多说 先上效果图 实现其实很简单,先用两张图 一张是背景的图,一张是笑脸的图片,笑脸的图片是白色,可能看不出来.实现思路:主要是再触摸view的时候同时移动这两个图片,但是移动的距离不一样,造成的错位感,代码很简单: import android.content.Context import android.graphics.* import android.util.AttributeSet import android.view.MotionEvent import android.vi

  • Android ItemDecoration 实现分组索引列表的示例代码

    本文介绍了Android ItemDecoration 实现分组索引列表的示例代码,分享给大家.具体如下: 先来看看效果: 我们要实现的效果主要涉及三个部分: 分组 GroupHeader 分割线 SideBar 前两个部分涉及到一个ItemDecoration类,也是我们接下来的重点,该类是RecyclerView的一个抽象静态内部类,主要作用就是给RecyclerView的ItemView绘制额外的装饰效果,例如给RecyclerView添加分割线. 使用ItemDecoration时需要继

  • Android 实现无网络传输文件的示例代码

    最近的项目需要实现一个 Android 手机之间无网络传输文件的功能,就发现了 Wifi P2P(Wifi点对点)这么一个功能,最后也实现了通过 Wifi 隔空传输文件 的功能,这里我也来整理下代码,分享给大家. Wifi P2P 是在 Android 4.0 以及更高版本系统中加入的功能,通过 Wifi P2P 可以在不连接网络的情况下,直接与配对的设备进行数据交换.相对于蓝牙,Wifi P2P 的搜索速度和传输速度更快,传输距离更远 实现的效果如下所示: 客户端.png 服务器端.png 一

  • Android 带箭头的指引tipLayout实现示例代码

    本文介绍了Android 带箭头的指引tipLayout实现示例代码,分享给大家,具体如下: 如上是从UI接过来的设计图,要求三角形指示器需要动态对齐上面的文本,需要动态的实现对其三角形. 引用方式 compile 'com.xiaowei:TriangleTipLayout:1.0.0' 实现思路 准备一个三角形指引的图片即可. 先上代码 final TextPaint textPaint = mTextView.getPaint(); final int textHeight = (int)

  • Android PC投屏功能实现的示例代码

    本文介绍了Android PC投屏功能实现的示例代码,分享给大家,具体如下: 代码地址 :https://github.com/deepsadness/MediaProjectionDemo 效果预览 投屏效果预览 简单说明: 使用Android MediaProjection Api来完成视频的截图 通过WebSocket进行链接.将图片传递给网页 想法来源 看到vysor,觉得特别好玩,于是就想着自己能不能试着做一个类似的功能出来.搜索了相关实现.发现网上已经有网友针对vysor做了分析.于

  • Android Studio实现简单音乐播放功能的示例代码

    项目要求 基于Broadcast,BroadcastReceiver等与广播相关的知识实现简单的音乐播放功能,包括音乐的播放.暂停.切换.进度选择.音量调整. 设计效果 (进度条时间刷新功能还没有实现) 实现思路 音乐服务端负责播放音乐和收发广播的功能.当音乐服务端作为接收器时,只能接收到主页面广播的控制消息:作为发送器时,向主页面发送歌曲信息更新的消息 主页面负责进度条以及音量按钮的监听,同时也有收发广播的功能.当主页面作为接收器时,只能接收到音乐服务端广播的歌曲信息更新的消息:作为发送器时,

  • Android利用贝塞尔曲线绘制动画的示例代码

    目录 彩虹系列 弹簧动画 复杂立体感动画 总结 前面我们花了几篇介绍了贝塞尔曲线的原理和绘制贝塞尔曲线,着实让我们见识到了贝塞尔曲线的美.好奇心驱使我想看看贝塞尔曲线动起来会是什么样?本篇就借由动画驱动贝塞尔曲线绘制看看动起来的贝塞尔曲线什么效果. 彩虹系列 通过动画控制绘制的结束点,就可以让贝塞尔曲线动起来.例如下面的动图展示的效果,看起来像搭了一个滑滑梯一样.实际上就是用7条贝塞尔曲线实现的,我们使用了 Animation 对象的值来控制绘制的结束点,从而实现了对应的动画效果. 具体源码如下

随机推荐