为什么诺基亚6没有沉浸式状态栏是什么

【01-31水贴】说好的沉浸式状态栏呢【android吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,254,369贴子:
【01-31水贴】说好的沉浸式状态栏呢收藏
刚刚更新了一看,沉浸个鬼
Android入门到精通在线直播录制,群内Android大牛免费指导教学,直播+视频Android在线免费学习,直播教学.
还是大黑条
必须自带主题
打开它的全屏模式,就是沉浸了
更新一下框架就行了
在设置里开启全屏=沉浸
什么鬼?5.0
   --谁的眉心被画出江山的模样,谁的指尖被梦涂上娇羞的浓妆
难道只有我一个人觉得安吧都是一群逗比吗?全屏模式早在几年前就有了,隐藏状态栏就等于沉浸的话,沉浸这个名词就是个笑话。
注册即可领取万元福利!!!免费注册成为租号玩会员!
这不是10.2吧,我也更新了,版本号是10.13
无语———诺基亚N9不跟随
天天动听好看   --50包邮收楼主妹妹
他妈的,我的也不可以
你用的是最新内测版吗    ——— 以前喜欢一个人, 现在喜欢一个人。   
我的就沉浸了                  哈哈哈哈,顶顶你,升级更快乐,轻轻松松水经验        --来自助手版贴吧客户端
5.0都没变色
flyme表示没有
每对新人结婚成功的那一刻,送礼最多的吧友可以获得本次求婚的“月老”称号和成就,
沉浸式是全屏模式,反正uc已经做到了(播放视频终于可以沉浸了)。他们给的承诺是沉浸式不是状态栏透明。
10.2也不支持这次还是QQ良心
不是说好的没有黑条吗
其实我感觉这样很好看啊
同4.4为什么我的沉浸了
qq浏览器最新公测版貌似支持了
登录百度帐号推荐应用Android透明化/沉浸式状态栏实践及源码分析 - Android developer. - CSDN博客
Android透明化/沉浸式状态栏实践及源码分析
何为透明状态栏?有人说透明状态栏就是沉浸式状态栏,这里不多解释,详见。本文将对于透明状态栏设置方法做一个讲解,以及遇到的问题该怎么解决,来面对各种需求。
本文所提到的透明状态栏其实指的是将顶部的导航栏延伸到状态栏,使之浑然一体(Google官方建议状态栏颜色比导航栏的颜色略深一点),并不代表一定不设置背景色,比如导航栏是白色,则可设置状态栏为白色,视情况而定。
相比于iOS系统,Android系统对于状态栏的设置就显得稍微复杂了一点。Android系统提供了API 19以上对状态栏的设置接口,而直到API 23以上才提供对于icon颜色的设置,还有就是各家厂商(如魅族,小米等)对于状态栏的有自己的定制,对于需要使用浅色背景状态栏的应用,没处理好的话往往导致浅色背景,白色icon ,状态栏不分你我的悲剧。。
(内心os:嗯?右上角那一个绿色的电池,用户一定知道他是状态栏对吧。)
我随即对比了一些主流app,发现在我的魅蓝2(Android 5.1 Flyme 4.5)上竟然都不支持透明状态栏,这对于我这种追求审美的人(其实是视觉提的需求)来说简直不能忍。在我折腾了几天之后,终于解决了这些问题,希望对大家思路有一些帮助。
言归正传,本文主要针对以下几点进行分析:1.是否隐藏状态栏(全屏模式) 2.状态栏的背景色的设置 3.状态栏icon的颜色的设置,而对于透明状态栏设置过程中,可能造成的icon颜色设置成功,而背景颜色设置失败,等等原因造成的浅色底,浅色字或深色底,深色字等错误情况的处理及兜底方案 4.源码实现。
下面我们就以上几点来讨论一下Android中透明状态栏的实现。
1. 全屏模式(沉浸式状态栏)
这种情况其实用得并不多,基本上使用场景在闪屏页展示广告或logo,以及一些阅读类app需要尽可能的利用到屏幕大小,展示更多的内容。
设置方法很简单,分两种,在API & 16时:
theme中定义:将自定义该Activtiy的theme,并在其中添加
* 代码中定义:
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
&div class="se-preview-section-delimiter"&&/div&
2. 状态栏的背景色
我们都知道,在Android5.0(即API & 21)时,Google官方提供接口设置对应的状态栏背景色
window.setStatusBarColor(@ColorInt int color);
&div class="se-preview-section-delimiter"&&/div&
那我们要想在Android5.0以下设置背景色就真的没有办法了吗?并不是,我们发现在Android4.4以后,出现了windowTranslucentStatus这一特性,所以思路如下:
先设置状态栏的透明属性
给根布局顶部加上一个和状态栏一样大小的矩形View,充当假的状态栏
设置FitsSystemWindows属性为true,此时跟布局会延伸到状态栏,处在顶部位置就是之前设置的view,这样就可以以假乱真了。
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
View statusView = createStatusView(activity, color);
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(statusView);
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
rootView.setFitsSystemWindows(true);
rootView.setClipToPadding(true);
&div class="se-preview-section-delimiter"&&/div&
设置矩形色块的代码如下:
private static View createStatusView(Activity activity, int color) {
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
View statusView = new View(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
statusBarHeight);
statusView.setLayoutParams(params);
statusView.setBackgroundColor(color);
return statusV
&div class="se-preview-section-delimiter"&&/div&
效果如下:
3. 状态栏icon的颜色
我们通过调研发现,魅族和小米的两个厂商分别对于Flyme及MIUI做了状态栏的定制,所以我们可以在Flyme4.0以上及MIUIV6以上都可以实现icon颜色的替换,结合上述的状态栏背景色的替换,我们就可以对于魅族及小米两款机型适配浅色的导航栏了。
3.1 魅族Flyme4.0+
* 魅族Flyme4+以上透明状态栏
* dark 是否把状态栏字体及图标颜色设置为深色
* 是否设置成功
public static boolean setMeizuStatusBarDarkIcon(Window window, boolean dark) {
boolean result = false;
if (window != null) {
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 &= ~
meizuFlags.setInt(lp, value);
window.setAttributes(lp);
result = true;
} catch (Exception e) {
&div class="se-preview-section-delimiter"&&/div&
3.2 MIUIV6.0+
* 设置状态栏字体图标为深色,需要MIUIV6以上
dark 是否把状态栏字体及图标颜色设置为深色
是否设置成功
public static boolean setMIUIStatusBarLightMode(Window window, boolean dark) {
boolean result = false;
if (window != null) {
Class clazz = window.getClass();
int darkModeFlag = 0;
Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(window,darkModeFlag,darkModeFlag);
extraFlagField.invoke(window, 0, darkModeFlag);
result=true;
}catch (Exception e){
&div class="se-preview-section-delimiter"&&/div&
效果如下:
4. 设置背景色失败处理方案
4.1 解决思路
说了那么多,有童鞋可能就问了,上述说的代码可能对大多数机型有效,但是万一某些机型设置失败了呢?体验不但没提升,反倒让用户不能忍受了。
好吧,下面我们来看一下应该怎么解决。思路如下:
获取状态栏的背景色,与需要设置的颜色进行比对,如果相等则设置成功。
如果背景色设置失败,针对非Flyme机型,我们回退状态栏icon颜色,还原到最初状态。
上述为什么要强调非Flyme机型,是因为用过Flyme机型的童鞋肯定知道有一个透明状态栏的开关,当开启后,Flyme会对状态栏进行处理,但处理效果并不和我们想要的一样(比如视图顶部为黑色背景,但是却设置了白色状态栏),并且两者都对状态栏进行操作,操作的冲突也有可能引起上述的icon颜色不明显的情况,所以我们自己定义一个ColorDrawable进行替换。
4.2 获取状态栏颜色
* 获取状态栏颜色
window 需要获取的activity
状态栏的颜色值
public static int getColor(Window window){
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.LOLLIPOP) {
return window.getStatusBarColor();
}else if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.KITKAT) {
ViewGroup decorView = (ViewGroup) window.getDecorView();
int count = decorView.getChildCount();
if (count & 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) {
int color = Color.TRANSPARENT;
Drawable background = decorView.getChildAt(count - 1).getBackground();
if (background instanceof ColorDrawable)
color = ((ColorDrawable) background).getColor();
return -1;
&div class="se-preview-section-delimiter"&&/div&
下面讲一下针对如何屏蔽Flyme机型沉浸式状态栏打开时的影响:
private static boolean setMeizuStatusColor(Window window, @ColorInt int color, int alpha) {
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.LOLLIPOP) {
final View view = window.getDecorView().findViewById(android.R.id.statusBarBackground);
if (view != null) {
if (!(view.getBackground() instanceof MeizuColorDrawable)) {
view.setBackground(new MeizuColorDrawable());
if (view.getBackground() instanceof MeizuColorDrawable) {
MeizuColorDrawable colorDrawable = (MeizuColorDrawable) view.getBackground();
int finalColor = StatusBarUtil.calculateStatusColor(color, alpha);
view.setBackgroundColor(finalColor);
colorDrawable.setColor(finalColor);
return true;
return false;
&div class="se-preview-section-delimiter"&&/div&
4.3 兜底方案
上面提到了一些失败判断途径,那么如果还是对一些机型无效呢?我的建议是可以在本地预埋一个开关,万一出问题,服务器可以对相应机型的沉浸式开关关掉即可,或者采用hotfix等方式来进行修复。
5. 源码分析
看过上面针对魅族和小米设置icon的源代码我们知道,共同点都是通过反射来进行调用相应的方法,或者对于相应的状态栏视图进行设置颜色。
我们来看看源码,在Window中有一个抽象方法是setStatusBarColor而在PhoneWindow中我们找到了该方法的实现
public void setStatusBarColor(int color) {
mStatusBarColor =
mForcedStatusBarColor = true;
if (mDecor != null) {
mDecor.updateColorViews(null, false );
&div class="se-preview-section-delimiter"&&/div&
mDecor.updateColorViews()
private WindowInsets updateColorViews(WindowInsets insets, boolean animate) {
updateColorViewInt(mNavigationColorViewState, sysUiVisibility, mNavigationBarColor,
navBarSize, navBarToRightEdge, 0 ,
animate && !disallowAnimate);
boolean statusBarNeedsRightInset = navBarToRightEdge
&& mNavigationColorViewState.
int statusBarRightInset = statusBarNeedsRightInset ? mLastRightInset : 0;
updateColorViewInt(mStatusColorViewState, sysUiVisibility, mStatusBarColor,
mLastTopInset, false , statusBarRightInset,
animate && !disallowAnimate);
&div class="se-preview-section-delimiter"&&/div&
那么mNavigationColorViewState和mStatusColorViewState又是什么呢?
别着急,我们继续往下看
private final ColorViewState mStatusColorViewState = new ColorViewState(
SYSTEM_UI_FLAG_FULLSCREEN, FLAG_TRANSLUCENT_STATUS,
Gravity.TOP,
Gravity.LEFT,
STATUS_BAR_BACKGROUND_TRANSITION_NAME,
com.android.internal.R.id.statusBarBackground,
FLAG_FULLSCREEN);
private final ColorViewState mNavigationColorViewState = new ColorViewState(
SYSTEM_UI_FLAG_HIDE_NAVIGATION, FLAG_TRANSLUCENT_NAVIGATION,
Gravity.BOTTOM,
Gravity.RIGHT,
NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME,
com.android.internal.R.id.navigationBarBackground,
&div class="se-preview-section-delimiter"&&/div&
mNavigationColorViewState和mStatusColorViewState这两个都是ColorViewState定义好的ColorViewState,主要存储了关于statusbar的一些视图信息。包括id,translucentFlag,verticalGravity等等。
接着看updateColorViewInt()方法,这个方法是对一个View设置颜色的,自然这个View也就是指的状态栏的View,下面来看一下实现:
private void updateColorViewInt(final ColorViewState state, int sysUiVis, int color,
int size, boolean verticalBar, int rightMargin, boolean animate) {
state.present = size & 0 && (sysUiVis & state.systemUiHideFlag) == 0
&& (getAttributes().flags & state.hideWindowFlag) == 0
&& (getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0;
boolean show = state.present
&& (color & Color.BLACK) != 0
&& (getAttributes().flags & state.translucentFlag) == 0;
boolean visibilityChanged = false;
View view = state.
int resolvedHeight = verticalBar ? LayoutParams.MATCH_PARENT :
int resolvedWidth = verticalBar ? size : LayoutParams.MATCH_PARENT;
int resolvedGravity = verticalBar ? state.horizontalGravity : state.verticalG
if (view == null) {
if (show) {
state.view = view = new View(mContext);
view.setBackgroundColor(color);
view.setTransitionName(state.transitionName);
view.setId(state.id);
visibilityChanged = true;
view.setVisibility(INVISIBLE);
state.targetVisibility = VISIBLE;
LayoutParams lp = new LayoutParams(resolvedWidth, resolvedHeight,
resolvedGravity);
lp.rightMargin = rightM
addView(view, lp);
updateColorViewTranslations();
int vis = show ? VISIBLE : INVISIBLE;
visibilityChanged = state.targetVisibility !=
state.targetVisibility =
if (show) {
LayoutParams lp = (LayoutParams) view.getLayoutParams();
if (lp.height != resolvedHeight || lp.width != resolvedWidth
|| lp.gravity != resolvedGravity || lp.rightMargin != rightMargin) {
lp.height = resolvedH
lp.width = resolvedW
lp.gravity = resolvedG
lp.rightMargin = rightM
view.setLayoutParams(lp);
view.setBackgroundColor(color);
if (visibilityChanged) {
view.animate().cancel();
if (animate) {
if (show) {
if (view.getVisibility() != VISIBLE) {
view.setVisibility(VISIBLE);
view.setAlpha(0.0f);
view.animate().alpha(1.0f).setInterpolator(mShowInterpolator).
setDuration(mBarEnterExitDuration);
view.animate().alpha(0.0f).setInterpolator(mHideInterpolator)
.setDuration(mBarEnterExitDuration)
.withEndAction(new Runnable() {
public void run() {
state.view.setAlpha(1.0f);
state.view.setVisibility(INVISIBLE);
view.setAlpha(1.0f);
view.setVisibility(show ? VISIBLE : INVISIBLE);
话说了这么多,其实就是想让大家知道为什么很多app放弃在较低版本的Android系统对状态栏进行视觉修改,尤其是浅色导航栏的应用。[捂脸]
本人目前在网易搬砖,如果想要挪挪地方,,选好部门及岗位以后,欢迎投简历给我(changan_),我来帮您内推。
最后欢迎拍砖,说得不好的地方或者有误的地方可以在评论区交流~
喜欢的话给民工打赏晚饭加个鸡腿就更好了,谢谢~
话说了这么多,其实就是想让大家知道为什么很多app放弃在较低版本的Android系统对状态栏进行视觉修改,尤其是浅色导航栏的应用。[捂脸]
本人目前在网易搬砖,如果想要挪挪地方,,选好部门及岗位以后,欢迎投简历给我(changan_),我来帮您内推。
最后欢迎拍砖,说得不好的地方或者有误的地方可以在评论区交流~
相关文章推荐联想A708t刷机包 乐蛙OS6-全新沉浸式状态栏浑然忘我,方得始终- ROM下载 刷机网
联想A708t刷机包 乐蛙OS6-全新沉浸式状态栏浑然忘我,方得始终-
评分:★★★
发布日期:
刷机包预览
刷机包介绍
优化 锁屏待机来电时,来电铃声先响,亮屏延迟的现象优化 文件管理器使用流畅度优化 半透模糊模式时手机内存占用情况[重点修复]修复 [S960/S960T]已设置图案解锁,使用支付宝付款,确认后转到解锁界面,解锁后仍然停留在支付界面的问题修复 进入全部设置任意选项后返回,会回到全部设置顶部的问题[通话]修复 通话过程中展开拨号盘,拨号盘与状态栏太近的问题修复 拨号界面输入“”,桌面显示“一号店”,拨通后语音提示“欢迎致电神州专车” 的问题[黄页]优化 无网络时,黄页号码附近网点的提醒界面修复 切换到繁体中文,再切换回简体中文,黄页号码通话记录列表还是显示繁体的问题[流量监控]修复 某些情况下流量校准提示成功但是剩余流量数值无变化的问题修复 流量设置中更改“本月已用”的流量单位后,输入法不自动弹出的问题[公告控件]优化 下载完主题、添加城市时弹出的小框风格修复 部分弹窗界面不是沉浸式状态栏的问题[百变主题]修复 百变主题本地锁屏样式中默认锁屏样式预览与点击查看显示不一致的问题修复 百变主题本地锁屏壁纸点击第一张绿色壁纸显示锁屏样式的问题修复 某些情况下百变主题显示的正在使用的壁纸与实际使用壁纸不一致的问题修复 更换字体会将后台音乐播放器清理掉的问题修复 一键换壁纸会使后台FM停止播放的问题修复 百变主题加载在线主题时,在线主题顶部第一行主题缩略图显示不全的问题修复 百变主题中下载壁纸,点击下载后,桌面下方下载进度条短暂消失后重新出现的问题[天气]优化 天气4*2 小部件显示修复 强制停止并清除天气数据,返回天气中删除城市,天气强制关闭的问题修复 天气应用中添加城市至上限值,反复点击继续添加城市,桌面小提示框会一直存在的问题[第三方应用]修复 手机中已安装QQ游戏,在QQ游戏中下载并安装英雄杀后,“我的游戏”中仍然显示“等待安装”的问题修复 使用"天行听书“时,系统无故重启的问题修复 微信电话本在获取root后将其设为默认应用,乐蛙系统的拨号、联系人、短信被替代的问题[桌面]优化 桌面空间已满,继续添加图标,增加提示语修复 设置桌面壁纸后->重置桌面->打开文件夹,文件夹背景为之前设置的桌面壁纸的问题修复 使用三方应用设置壁纸,壁纸居右显示,重启后壁纸会变为居中显示的问题【ROM特点】乐蛙OS6,灵动色彩,悦动随心沉浸式,浑然忘我,方得始终全新锁屏,优雅直观的第一眼精彩桌面,从此爱上摆弄桌面简单实用通讯录,打造极致基础通讯体验升级内容服务,海量应用,精彩每一天更多精彩,等你发现… …【适合群体】1.喜欢追求文艺桌面、更多功能的ROM用户2.追求更符合中国人习惯的ROM用户
刷机包下载
ROM大小:362 MB更多下载地址:

我要回帖

更多关于 安卓沉浸式状态栏 的文章

 

随机推荐