android:沉浸式状态栏(状态栏一体化)
16lz
2021-01-24
沉浸式状态栏是从IOS流行起来的,毕竟整个界面设计的比较完美话,上面有个白条的话比较违和。然后android也慢慢流行起来。所以较早版本的android不支持沉浸式状态栏。
我们先看一下如果不设置状态栏的app界面(theme为NoActionBar):
是不是看到上面的状态栏比较违和?
样式一:
实现代码如下:
if (Build.VERSION.SDK_INT >= 21) { View decorView = getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); getWindow().setStatusBarColor(Color.TRANSPARENT); } // 如果theme是NoActionBar或者NoActionBar的子theme,如果添加下面两行代码会报异常// ActionBar actionBar = getSupportActionBar();// actionBar.hide();
然后我们看一下效果图,就会发现另一个问题:titleBar覆盖了状态栏
下一步我们要测量一下状态栏的高度并且设置titleBar的位置,实现代码如下:
测量状态栏的高度:
private int getStatusBarHeight() { Class<?> clazz = null; Object obj = null; Field field = null; int x = 0; try { clazz = Class.forName("com.android.internal.R$dimen"); obj = clazz.newInstance(); field = clazz.getField("status_bar_height"); x = Integer.parseInt(field.get(obj).toString()); return getResources().getDimensionPixelSize(x); } catch (Exception e) { e.printStackTrace(); return 75; } }
动态设置titleBar的位置:
int statusBarHeight = getStatusBarHeight(); Log.e("yushan", "statusBarHeight:" + statusBarHeight); title = (RelativeLayout)findViewById(R.id.title); RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) title.getLayoutParams(); lp.topMargin = statusBarHeight; title.setLayoutParams(lp);
最后咱们再看一下效果图:
哒哒,现在的效果是不是看着比较舒服~当然,有少数需求会把底部导航栏也渲染成同样的背景,实现代码如下:
if (Build.VERSION.SDK_INT >= 21) { View decorView = getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); getWindow().setNavigationBarColor(Color.TRANSPARENT); getWindow().setStatusBarColor(Color.TRANSPARENT); } // 如果theme是Theme.AppCompat.Light.NoActionBar或者子theme,如果添加下面两行代码会报异常// ActionBar actionBar = getSupportActionBar();// actionBar.hide();
效果图咱们就不贴了,可以自己运行一下看看。注意:沉浸式状态栏要在android5.0以上才会实现。
这里道长找了一个4.2的机子运行了一下,效果图如下:
样式二
当然还有的应用感觉状态栏也没有必要展示,比如一些视频播放类应用。实现代码如下:
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus && Build.VERSION.SDK_INT >= 19) { View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } }
效果图如下:
关于沉浸式状态栏就说这么多吧,一般这么多就可以应对绝大多数需求了。希望这篇博客能够为小伙伴们提供一些帮助。
更多相关文章
- Android(安卓)高手进阶教程(十四)之----Android(安卓)Location的
- Android单元测试之Robolectric
- 修正AppCompatSpinner弹出框位置问题
- Android内容提供者使用及创建
- Android网络请求框架AsyncHttpClient (android-async-http)介绍
- Android(安卓)10个快速开发框架:Afinal、ThinkAndroid、AndBase、
- Android系统的启动流程
- 转:编写高效的Android代码
- 解决eclipse中执行程序提示“Your project contains error(s),ple