//设置状态栏文字&图标暗色
systemUiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
//去除状态栏背景
mDecorView.setSystemUiVisibility(systemUiVisibility);
//设置状态栏透明
mSwipeBackActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
mSwipeBackActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
mSwipeBackActivity.getWindow().setStatusBarColor(Color.TRANSPARENT);
}
//监听DecorView的布局变化
mDecorView.addOnLayoutChangeListener(mPrivateListener);
return true;
}
这里有几个要注意的地方。
I. SDK小于19是不支持状态栏透明的,SD21及以上的实现方式也有所不同。
II. SD23及以上支持状态栏颜色反转。
III. SD24及以上支持窗口模式,这里要进行判断,当窗口模式时,不要设置状态栏透明。
IV. 状态栏设置透明之后,输入法的adjustResize
会失效。网传解决方案android:fitsSystemWindows="true"
不推荐使用,因为这会导致无法在状态栏之下进行绘制。因此这里对DecorView布局变化进行监听,布局变化时动态调整子View的高度为DecorView的可见部分。贴一下代码:
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//获取DecorView的可见区域
Rect visibleDisplayRect = new Rect();
mDecorView.getWindowVisibleDisplayFrame(visibleDisplayRect);
/*这里省略一小段代码,后文提及/
//状态栏透明情况下,输入法的adjustResize不会生效,这里手动调整View的高度以适配
if (isStatusBarTransparent()) {
for (int i = 0; i < mDecorView.getChildCount(); i++) {
View child = mDecorView.getChildAt(i);
if (child instanceof ViewGroup) {
//获取DecorView的子ViewGroup
ViewGroup.LayoutParams childLp = child.getLayoutParams();
//调整子ViewGroup的paddingBottom
int paddingBottom = bottom - visibleDisplayRect.bottom;
if (childLp instanceof ViewGroup.MarginLayoutParams) {
//此处减去bottomMargin,是考虑到导航栏的高度
paddingBottom -= ((ViewGroup.MarginLayoutParams) childLp).bottomMargin;
}
paddingBottom = Math.max(0, paddingBottom);
if (paddingBottom != child.getPaddingBottom()) {
//调整子ViewGroup的paddingBottom,以保证整个ViewGroup可见
child.setPadding(child.getPaddingLeft(), child.getPaddingTop(), child.getPaddingRight(), paddingBottom);
}
break;
}
}
}
}
这里同样有两个小点需要注意:一个是paddingBottom的计算一定要考虑到导航栏高度的计算。还有就是paddingBottom不能为负值。
- Step.2 支持侧滑