android 改變狀態列字型顏色和圖示顏色和沉浸式
阿新 • • 發佈:2019-02-18
設定沉浸式狀態列
protected boolean useThemestatusBarColor = false;//是否使用特殊的標題欄背景顏色,android5.0以上可以設定狀態列背景色,如果不使用則使用透明色值 protected boolean useStatusBarColor = true;//是否使用狀態列文字和圖示為暗色,如果狀態列採用了白色系,則需要使狀態列和圖示為暗色,android6.0以上可以設定 protected void setStatusBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上 View decorView = getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); //根據上面設定是否對狀態列單獨設定顏色 if (useThemestatusBarColor) { getWindow().setStatusBarColor(getResources().getColor(R.color.colorTheme)); } else { getWindow().setStatusBarColor(Color.TRANSPARENT); } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0 WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes(); localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !withoutUseStatusBarColor) {//android6.0以後可以對狀態列文字顏色和圖示進行修改 getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } }
另外一個設定沉浸式的
/** * 通過設定全屏,設定狀態列透明 * * @param activity */ private void fullScreen(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.x開始需要把顏色設定透明,否則導航欄會呈現系統預設的淺灰色 Window window = activity.getWindow(); View decorView = window.getDecorView(); //兩個 flag 要結合使用,表示讓應用的主體內容佔用系統狀態列的空間 int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); //導航欄顏色也可以正常設定 // window.setNavigationBarColor(Color.TRANSPARENT); } else { Window window = activity.getWindow(); WindowManager.LayoutParams attributes = window.getAttributes(); int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; attributes.flags |= flagTranslucentStatus;//設定全屏 attributes.flags |= flagTranslucentNavigation;//設定是否顯示標題欄 window.setAttributes(attributes); } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//android6.0以後可以對狀態列文字顏色和圖示進行修改 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } }
在Activity佈局的根節點處加上android:fitsSystemWindows=”true”屬性就可以了,要不佈局會跑到狀態列和導航欄下面,與導航欄和狀態列重疊,這當然不是我們希望的。
設定狀態列字型顏色和圖示顏色為暗色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !withoutUseStatusBarColor) {//android6.0以後可以對狀態列文字顏色和圖示進行修改 getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); }
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 是從API 16開始啟用,實現效果:
檢視延伸至狀態列區域,狀態列懸浮於檢視之上 - View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 是從 API 23開始啟用,實現效果:
設定狀態列圖示和狀態列文字顏色為深色,為適應狀態列背景為淺色調,該Flag只有在使用了FLAG_DRWS_SYSTEM_BAR_BACKGROUNDS,並且沒有使用FLAG_TRANSLUCENT_STATUS時才有效,即只有在透明狀態列時才有效。
設定狀態列字型顏色和圖示顏色為淺色
//設定狀態列文字顏色及圖示為淺色
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 是從API 16開始啟用,實現效果:
檢視延伸至狀態列區域,狀態列懸浮於檢視之上 - View.SYSTEM_UI_FLAG_LAYOUT_STABLE
保持整個View穩定, 常和控制System UI懸浮, 隱藏的Flags共用, 使View不會因為System UI的變化而重新layout。