开发中为了美观需要将状态栏设置为半透明/全透明, 多个界面需求不同,所以需要在代码中来根据不同情况设置
设置之前你需要知道:默认情况下状态栏是有高度的,app内容是在其之下。但是设置半透明/透明之后,状态栏又会覆盖在app内容之上。
情景1:APP顶部是一张图片,你想完成如下这种半透明效果
if (Build.VERSION.SDK_INT >= 21) {
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
情景2:APP顶部是一张图片,你想完成如下这种透明效果
if(Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.setStatusBarColor(Color.TRANSPARENT);
}
情景3:顶部是有文字,小图标等,如果直接用透明半透明 状态栏上的东西会与内容重叠(你觉得无所谓也可以直接用上面2部分代码),这样我们就想做成类似支付宝这样的效果:
前面说道设置半透明/透明之后状态栏就会覆盖在app内容之上了,所以我们需要在状态栏透明的情况下给app的根视图设置一个paddingTop,值为状态栏的高度。
/**
* 利用反射获取状态栏高度
* @return
*/
public int getStatusBarHeight() {
int result = 0;
//获取状态栏高度的资源id
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
设置paddingTop
ViewGroup rootView = getWindow().getDecorView().findViewById(android.R.id.main_root);
rootView.setPadding(0, getStatusBarHeight(), 0, 0);
main_root为根布局ID,然后同情景2,设置状态栏颜色(应用主题色),android SDK>=21
getWindow().setStatusBarColor(Color.BLUE);
SDK<21
ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
View statusBarView = new View(this);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight());
statusBarView.setBackgroundColor(Color.BLUE);
decorView.addView(statusBarView, lp);
肩膀(参考):https://www.jianshu.com/p/dc20e98b9a90
https://blog.csdn.net/d276031034/article/details/52934730
http://www.wufangbo.com/60690/