Android实现沉浸式效果
沉浸式效果简单来说就是指系统状态栏的颜色与App的顶部颜色一致。
那如何实现这种效果呢?有两种实现方式。
1. 设置状态栏颜色与app的顶部颜色一致,并在布局中设置android:fitsSystemWindows="true"
2. 设置状态栏透明,并在布局中设置android:fitsSystemWindows="false",注意如果设置为false,要预留状态栏的高度,不然会重叠,最好是代码动态适配,计算任务栏高度来适配刘海屏
下面给出相应设置状态栏颜色等的方法
修改状态栏背景颜色
/**
* 修改状态栏颜色,支持4.4以上版本
* @param activity
* @param colorId
*/
public static void setStatusBarColor(Activity activity, int colorId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(activity.getResources().getColor(colorId));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明
transparencyBar(activity);
SystemBarTintManager tintManager = new SystemBarTintManager(activity);
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintResource(colorId);
}
}
/**
* 设置状态栏透明,启用全屏模式
* @param activity
*/
@TargetApi(19)
public static void transparencyBar(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = activity.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
修改状态栏文字颜色 只支持白、黑
/**
* 谷歌原生方式改变状态栏文字颜色 只支持白、黑
* @param activity
* @param dark
*/
private static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {
View decor = activity.getWindow().getDecorView();
if (dark) {
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
为了适配虚拟键,一般还要根据app底部的颜色修改虚拟键的背景色,和按键色
底部虚拟键背景颜色.貌似不能设置为透明
/**
* 设置底部虚拟键背景颜色
* @param color
*/
public void setNavigationBarColor(int color) {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
int flag = getWindow().getDecorView().getSystemUiVisibility();
flag |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
if (Build.VERSION.SDK_INT >= 21) {
getWindow().setNavigationBarColor(getResources().getColor(color));
}
}
底部虚拟键按键颜色,只能是黑或白
/**
* 设置底部虚拟键按键是否为黑色(默认白色, 8.0 API)
* @param isDark
*/
public void setNavigationBarIconDark(boolean isDark) {
View decor = getWindow().getDecorView();
int flag = decor.getSystemUiVisibility();
if (isDark) {
flag |= SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
} else {
flag &= ~SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
}
decor.setSystemUiVisibility(flag);
}