/**
* Created by ricky.peng on 2018/5/25.
* @author ricky.peng
* 沉浸式状态栏工具类
*/
public class TStatusBarHelper {
//是否需要沉浸式状态栏
private static boolean isNeedTransStatus=true;
//沉浸式状态栏,比较复杂的沉浸式建议用这个
// 4.4上没有状态栏着色,如果状态栏变浅色容易导致看不清状态栏字体,
// 5.0有着色的时候,避免浅色状态栏看不清字体设置半透明状态栏
// 6.0 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR可以让系统自适应状态栏字体和背景色
public static void translucentStatus(Activity activity) {
if (activity == null||!isNeedTransStatus) {
return;
}
Window window = activity.getWindow();
if (window != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//取消状态栏透明
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//添加Flag把状态栏设为可绘制模式
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏颜色,API 21开始可以使用,低于6.0的时候,很多页面都是浅色的,导致状态栏不清晰,所以5.0设置半透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setStatusBarColor(Color.parseColor("#33000000"));
}
//设置系统状态栏处于可见状态
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
}
}
//沉浸式状态栏,如果UI设计比较简单,建议使用这个
public static void translucentEasyStatus(Activity activity) {
if (activity == null||!isNeedTransStatus) {
return;
}
Window window = activity.getWindow();
if (window != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//取消状态栏透明
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//添加Flag把状态栏设为可绘制模式
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏颜色,API 21开始可以使用,低于6.0的时候,很多页面都是浅色的,导致状态栏不清晰,所以5.0设置半透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.setStatusBarColor(Color.TRANSPARENT);
}
//设置系统状态栏处于可见状态
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
}
}
//沉浸式状态栏,微信的做法,通过UI设计同意toolbar和状态栏颜色,减少适配的问题
public static void translucentStatus(Activity activity,int color) {
if (activity == null||!isNeedTransStatus) {
return;
}
Window window = activity.getWindow();
if (window != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//取消状态栏透明
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//添加Flag把状态栏设为可绘制模式
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏颜色
window.setStatusBarColor(ContextCompat.getColor(activity, color));
//设置系统状态栏处于可见状态
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
}
}
//fragment的沉浸式适配,要让fragment的背景延伸到状态栏
// 不使用activity的背景色的时候,fitSystemWindows=false,然后再fragment中设置这个,否则直接设置fitSystemWindows=true会采用activity的背景色
public static void setStatusBarHeight(View view){
if (view!=null&&isNeedTransStatus) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
view.setPadding(0, getstatubarheight(view.getContext()), 0, 0);
}
}
}
//获取状态栏高度
private static int getstatubarheight(Context context) {
int height = 0;
int resourceid = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceid > 0) {
height = context.getResources().getDimensionPixelOffset(resourceid);
}
return height;
}
}
想要做到包括图片在内的沉浸, 必须理解好fitsSystemWindows属性, 以利用padding效果, 将内容上移或者下移
当然,还有xml的方法可以设置,百度谷歌都有很多,还有设置沉浸以后在顶部设置一个透明view的方法。
大家具体可以根据项目需求,选择最简单的实现。