Android实现状态栏(statusbar)渐变效果的示例

发布时间 - 2026-01-11 03:19:54    点击率:

前言

qq最近更新搞了渐变式状态栏.然后...新需求就是要加这个.唉

先来张效果图:


常见的方式:

设置Theme,状态栏透明.

 <item name="android:windowTranslucentStatus">true</item>

实现起来比较简单.

比如:SystemBarTint

几行代码搞定了.

但是.我要泼冷水,这种方式会引起这些问题:

1.软键盘弹起bug
2.fragment不适应

这种方式的优点:

兼容到4.4

我的看法:

1.用全屏模式或者状态栏透明的方式去实现,感觉很勉强
2.为了一个statusbar的效果,然后去处理一大堆不适应,我认为是不值得的.特别是软键盘弹出的问题
3.如果为了适配4.4,要费这么大功夫的话...

我的实现方式:

1.拿到StatusBar:

很简单,翻翻DecorView源码,就能知道,是通过ColorViewState 配置创建的View.


由于是私有成员,要拿到对应的参数,一般做法是使用反射.

这里我取了点巧,既然是View,那么就能findviewbyId找到

只要想办法拿到com.android.internal.R.id.statusBarBackground这个id值就行了

 private void initStatusBar() {
    if (statusBarView == null) {
      //android系统级的资源id得这么拿,不然拿不到
      int identifier = getResources().getIdentifier("statusBarBackground", "id", "android");
      statusBarView = getWindow().findViewById(identifier);
    }
    if (statusBarView != null) {
      statusBarView.setBackgroundResource("你的渐变drawable资源id");
    }
  }

2.等StatusBar绘制完成

如果你直接在onCreate中调用上面的方法,你会发现,拿到的是null.

这是因为Statusbar还没绘制完成.

所以,可以在onCreate()中使用Looper.myQueue().addIdleHandler()来保证Statusbar绘制完成后再findview.

然后对DecorView设置addOnLayoutChangeListener监听

当布局发生变化,就设置statusbar的背景

    Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
      @Override
      public boolean queueIdle() {
        if (isStatusBar()) {
          initStatusBar();
          getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
              initStatusBar();
            }
          });
        }
        return false;
      }
    });

3.为什么要addOnLayoutChangeListener:

其实不加监听,也能实现改变statusbar颜色的效果..但是会出现问题

比如弹软键盘后,弹popwindow后,引起window状态改变时,statusbar的颜色就会复原...

基本完整的代码

  private View statusBarView;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    //延时加载数据.
    Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
      @Override
      public boolean queueIdle() {
        if (isStatusBar()) {
          initStatusBar();
          getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
              initStatusBar();
            }
          });
        }
        //只走一次
        return false;
      }
    });
  }
  private void initStatusBar() {
    if (statusBarView == null) {
      int identifier = getResources().getIdentifier("statusBarBackground", "id", "android");
      statusBarView = getWindow().findViewById(identifier);
    }
    if (statusBarView != null) {
        statusBarView.setBackgroundResource("你的渐变drawable资源id");
    }
  }

   protected boolean isStatusBar() {
    return true;
  }

这种方式的缺点:

1.因为没有使用全屏的模式,所以适配4.4是没戏了.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android状态栏渐变  # android  # 状态栏渐变色  # Android Usb设备的监听(Dev)外设端口的判定以及耳机的插拔  # C# WPF使用AForge类库操作USB摄像头拍照并保存  # android通过usb读取U盘的方法  # Android Studio使用USB真机调试详解  # Android StatusBar 透明化方法(不同的版本适配)  # Android串口通信封装之OkUSB的示例代码  # Android 利用广播监听usb连接状态(变化情况)  # 详解Android USB转串口通信开发基本流程  # C语言实现模拟USB对8bit数据的NRZI编码输出  # 就能  # 状态栏  # 全屏  # 不适应  # 的是  # 就会  # 如果你  # 我要  # 还没  # 泼冷水  # 也能  # 我认为  # 很简单  # 弹出  # 这么大  # 想办法  # 这是因为  # 不加  # 你会发现  # 最近更新 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS中配置站点IP、端口及主机头?  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何在云主机快速搭建网站站点?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Laravel如何使用Vite进行前端资源打包?(配置示例)  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  如何在建站之星绑定自定义域名?  教你用AI润色文章,让你的文字表达更专业  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  C语言设计一个闪闪的圣诞树  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  使用spring连接及操作mongodb3.0实例  如何在IIS中新建站点并配置端口与物理路径?  开心动漫网站制作软件下载,十分开心动画为何停播?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  高防服务器如何保障网站安全无虞?  大型企业网站制作流程,做网站需要注册公司吗?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Android Socket接口实现即时通讯实例代码  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Laravel如何处理文件下载请求?(Response示例)  HTML 中动态设置元素 name 属性的正确语法详解  如何在阿里云香港服务器快速搭建网站?  如何快速配置高效服务器建站软件?  企业网站制作这些问题要关注  PHP正则匹配日期和时间(时间戳转换)的实例代码  北京网站制作的公司有哪些,北京白云观官方网站?  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  iOS正则表达式验证手机号、邮箱、身份证号等  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Laravel如何实现数据库事务?(DB Facade示例)  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  音乐网站服务器如何优化API响应速度?  如何快速查询网站的真实建站时间?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  手机网站制作与建设方案,手机网站如何建设?  zabbix利用python脚本发送报警邮件的方法  Python文件操作最佳实践_稳定性说明【指导】