1. 程式人生 > >android 改變狀態列字型顏色和圖示顏色和沉浸式

android 改變狀態列字型顏色和圖示顏色和沉浸式

設定沉浸式狀態列

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。