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文件操作最佳实践_稳定性说明【指导】

