Android 状态栏(沉浸式状态栏 Immersive Sta
2020-08-18 本文已影响0人
可乐_JS
-
可以直接看下面的:更新20210224
-
记录最近一次关于实现带图片的沉浸式状态栏的功能实现
1.设置window全屏、状态栏透明、让应用主体占据状态栏空间
- 可以在BaseActivity中,也可以写成工具类
/**
* 设置状态栏透明
*
* @param act
*/
public void setTranslucentStatus(Activity act) {
if (null == act) {
return;
}
Window window = act.getWindow();
if (null == window) {
return;
}
// 5.0以上系统状态栏透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
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.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
2.设置根布局请求系统预留状态栏高度的padding值
android:fitsSystemWindows="true"
3.设置需要的状态栏的颜色或者图片
- 在BaseActivity中的根布局设置需要的背景颜色或者背景图片
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_FFFFFF"
android:fitsSystemWindows="true">
……省略
</FrameLayout>
- 除了上面的方法还可以通过设置Theme的方式来设置
<!-- APP主题-->
<style name="TransparentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/window_background</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
注意:上述关于设置状态栏的适用于5.0及以上的系统
补充-200923
今天在跑5.1的手机的时候使用theme+图片设置的背景的图片被拉升的不像样子了!!!裹紧我的小被子~~~
试了下api23以下的都是会被拉升的,被拉升的样子很夸张,也没精力去研究,所以就简单记录下
又不想改实现方式,所以就在原来的基础上改,把图片从之前的item中放到了bitmap里边,然后加上gravity和边距的修饰,终于达到了想要的效果,具体修改如下:
-
-之前的theme:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MissingDefaultResource">
<item android:drawable="@color/color_FFFFFF" />
<item android:gravity="top">
<layer-list>
<item android:drawable="@drawable/ic_top_big_bg" />
<item
android:drawable="@drawable/ic_top_bg_center"
android:gravity="center" />
</layer-list>
</item>
</layer-list>
-
更改后的theme:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MissingDefaultResource">
<item android:drawable="@color/color_FFFFFF" />
<item android:gravity="top">
<layer-list>
<item android:gravity="top">
<bitmap
android:gravity="fill_horizontal|top"
android:src="@drawable/ic_top_big_bg" />
</item>
<item
android:gravity="top"
android:top="@dimen/dp_85">
<bitmap
android:gravity="center_horizontal|top"
android:src="@drawable/ic_top_bg_center" />
</item>
</layer-list>
</item>
</layer-list>
实现可能比较low,但是实在是不想改了,要不是公司给的测试机是5.1的都不想适配哈哈哈~~~
更新20210224
沉浸式状态栏的最新实现(sdk>=19):
1.对Activity设置:
<item name="android:windowTranslucentStatus">true</item>
或者
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
//上面设置的状态栏为半透明,透明状态栏设置
public static void transparentStatusBar(final Window window) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
int vis = window.getDecorView().getSystemUiVisibility();
window.getDecorView().setSystemUiVisibility(option | vis);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
2.在顶层需要占据状态栏的布局中设置:
android:fitsSystemWindows="true"
参考文档
https://blog.csdn.net/qq_34681580/article/details/103955191