天天看點

(AS筆記)Android全透明沉浸式主題樣式——代碼篇目錄1.前言2.Android目前SDK版本号 > API 19-Android 4.43.Android目前SDK版本号 > API 21-Android 5.04.擴充知識點5.完整沉浸式主題代碼6.總結

目錄

  • 1.前言
  • 2.Android目前SDK版本号 > API 19-Android 4.4
  • 3.Android目前SDK版本号 > API 21-Android 5.0
  • 4.擴充知識點
  • 5.完整沉浸式主題代碼
  • 6.總結

1.前言

        上一章,介紹了Theme主題設定方式,實作沉浸式主題。那本文就記錄代碼實作沉浸式主題效果。

        Theme設定沉浸式,傳送門連結:

        (AS筆記)Android全透明沉浸式主題樣式——頂部狀态欄+底部導航欄

          CSDN連結:https://blog.csdn.net/qq_39038178/article/details/119657376

        沉浸式工具類,傳送門連結:

        (AS筆記)Android全透明沉浸式主題樣式——工具類篇

          CSDN連結:https://blog.csdn.net/qq_39038178/article/details/119847976

2.Android目前SDK版本号 > API 19-Android 4.4

        (1)設定頂部狀态欄半透明

Window window = getWindow(); //擷取window對象
//若沒有指定屬性,頂部狀态欄預設淺灰色
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           

        (2)設定底部狀導航欄半透明

Window window = getWindow(); //擷取window對象
//若沒有指定屬性,底部導航欄預設黑色
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
           

        (3)Android版本判斷,同時設定(1)和(2)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window window = getWindow(); //擷取window對象
    //設定頂部狀态欄半透明
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    //設定底部狀導航欄半透明
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
           
(AS筆記)Android全透明沉浸式主題樣式——代碼篇目錄1.前言2.Android目前SDK版本号 > API 19-Android 4.43.Android目前SDK版本号 > API 21-Android 5.04.擴充知識點5.完整沉浸式主題代碼6.總結

3.Android目前SDK版本号 > API 21-Android 5.0

        (1)全屏顯示+狀态欄自動隐藏:手勢下滑,顯示出來——下滑=失效,應用主體内容不占用系統狀态欄空間

Window window = getWindow();
//隐藏頂部狀态欄,下滑一次失效
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); 
           

        (2)全屏顯示+狀态欄固定顯示:不監聽手勢——應用主體内容占用系統狀态欄空間

Window window = getWindow();
//全屏顯示+狀态欄固定
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
//固定布局,搭配View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,屬實絕配
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
           

        (3)隐藏頂部狀态欄:全屏顯示+狀态欄固定後,此時頂部狀态欄被占用,并且沒有指定屬性,是以會預設淺灰色

Window window = getWindow();
//頂部狀态欄透明——Android 5.0+ 的屬性
window.setStatusBarColor(Color.TRANSPARENT);
           
說明:已經實作沉浸式=頂部狀态欄被應用主體内容占用+實作狀态欄透明,效果如下:
(AS筆記)Android全透明沉浸式主題樣式——代碼篇目錄1.前言2.Android目前SDK版本号 > API 19-Android 4.43.Android目前SDK版本号 > API 21-Android 5.04.擴充知識點5.完整沉浸式主題代碼6.總結

        (4)設定狀态欄字型顔色,隻支援Android 6.0及以上版本

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
           
(AS筆記)Android全透明沉浸式主題樣式——代碼篇目錄1.前言2.Android目前SDK版本号 > API 19-Android 4.43.Android目前SDK版本号 > API 21-Android 5.04.擴充知識點5.完整沉浸式主題代碼6.總結

        (5)隐藏底部導航欄+不固定:監聽手勢——觸屏=失效

Window window = getWindow();
//隐藏底部導航欄,觸屏失效
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
           
(AS筆記)Android全透明沉浸式主題樣式——代碼篇目錄1.前言2.Android目前SDK版本号 > API 19-Android 4.43.Android目前SDK版本号 > API 21-Android 5.04.擴充知識點5.完整沉浸式主題代碼6.總結

        (6)自動隐藏底部導航欄+固定:監聽手勢——上滑彈出=不失效

Window window = getWindow();
//隐藏底部導航欄,觸屏失效
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
//強制固定布局,實作沉浸式
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
           
(AS筆記)Android全透明沉浸式主題樣式——代碼篇目錄1.前言2.Android目前SDK版本号 > API 19-Android 4.43.Android目前SDK版本号 > API 21-Android 5.04.擴充知識點5.完整沉浸式主題代碼6.總結

4.擴充知識點

        (1)禁用傳回鍵

/**
     * 屏蔽實體傳回按鈕
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK){
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
           

        (2)頂部狀态欄主題

//Android 6.0 及以上版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR // 内容黑色主題
    |View.SYSTEM_UI_FLAG_LAYOUT_STABLE); // 内容主題跟随系統
}
           

        (3)頂部狀态欄設定顔色

Window window = getWindow();
//開啟狀态欄着色
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//設定狀态欄顔色
window.setStatusBarColor(getResources().getColor(R.color.colorAccent));
           

        (4)設定不能橫屏

//設定不能橫屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//設定不能橫屏
           

5.完整沉浸式主題代碼

/**
     * 設定全屏顯示:頂部狀态欄透明+底部導航欄透明
     *
     * @param activity
     */
    private void fullScreen(Activity activity) {
        /**
         * Android目前SDK版本号 > API 19-Android 4.4
         */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = getWindow(); //擷取window對象
            //設定頂部狀态欄半透明
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //設定底部狀導航欄半透明
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
        /**
         * Android目前SDK版本号 > API 21-Android 5.0
         */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS//設定頂部狀态欄半透明
                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//設定底部狀導航欄半透明
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    |View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隐藏底部導航欄
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setNavigationBarColor(Color.TRANSPARENT);//底部導航欄透明——API 21 後開飯的屬性
            //頂部狀态欄透明——Android 5.0+ 的屬性
            window.setStatusBarColor(Color.TRANSPARENT);
        }
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//            getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
//        }
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//設定不能橫屏
    }
           

6.總結

僅自己學習記錄,如有錯誤,敬請諒解~,謝謝~~~