Android 沉浸式狀態(tài)欄

沉浸式含義

首先先明確一點沉浸式狀態(tài)欄的說法并不準確账千,沉浸式是Android4.4推出的一種模式耍攘,可以使顯示系統(tǒng)消息的狀態(tài)欄(Status Bar)與最下方顯示虛擬按鍵的底部導(dǎo)航欄(Navigation Bar)被隱藏掉攘轩。
在谷歌開發(fā)文檔中對沉浸式的描述是:“系統(tǒng) UI 保持隱藏狀態(tài),即使在用戶與您的應(yīng)用或游戲交互時 - 您可以從屏幕上的任何位置(甚至在系統(tǒng)欄占據(jù)的其他位置)捕獲觸摸事件委造。這是您在應(yīng)用或游戲中創(chuàng)建更大墨闲、更加豐富和更加沉浸式的 UI 并減少視覺分散的絕佳方式》贫埽”

Android4.4沉浸式API

1颓影、沉浸式全屏模式
setSystemUiVisibility (int visibility)
看了下標記多達十來個,以下截取部分常用標記:

SYSTEM_UI_FLAG_FULLSCREEN(WindowManager.LayoutParams.FLAG_FULLSCREEN)//隱藏狀態(tài)欄懒鉴,手指在屏幕頂部往下拖動诡挂,狀態(tài)欄會再次出現(xiàn)且不會消失
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //配合SYSTEM_UI_FLAG_FULLSCREEN使用狀態(tài)欄出現(xiàn)時,不會擠壓activty的高度,隱藏狀態(tài)欄璃俗,手指在屏幕頂部往下拖動奴璃,狀態(tài)欄會再次出現(xiàn)且不會消失

SYSTEM_UI_FLAG_IMMERSIVE// 這個標記僅與SYSTEM_UI_FLAG_HIDE_NAVIGATION配合使用,在全屏模式下在狀態(tài)欄區(qū)域滑動會重新顯示狀態(tài)欄
SYSTEM_UI_FLAG_IMMERSIVE_STICKY//在全屏模式下在狀態(tài)欄區(qū)域滑動會重新顯示透明式狀態(tài)欄旧找,一會后會重新隱藏溺健,與SYSTEM_UI_FLAG_FULLSCREEN和SYSTEM_UI_FLAG_HIDE_NAVIGATION配合產(chǎn)生效果。

SYSTEM_UI_FLAG_HIDE_NAVIGATION//隱藏導(dǎo)航欄钮蛛,手指在導(dǎo)航欄滑動鞭缭,導(dǎo)航欄會再次出現(xiàn)且不會消失
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION//配合SYSTEM_UI_FLAG_HIDE_NAVIGATION使用導(dǎo)航欄會出現(xiàn)時,不會擠壓activty的高度魏颓,隱藏導(dǎo)航欄會岭辣,手指在導(dǎo)航欄滑動,導(dǎo)航欄會再次出現(xiàn)且不會消失

SYSTEM_UI_FLAG_LAYOUT_STABLE //保持內(nèi)容主體位置不變甸饱,不隨著Systembar的隱藏顯示而偏移

2沦童、透明系統(tǒng)狀態(tài)欄
新增兩個新主題背景Theme_Holo_NoActionBar、Theme_Holo_Light_NoActionBar叹话,如果需要不應(yīng)被系統(tǒng)狀態(tài)欄覆蓋的布局部分則應(yīng)該啟用fitsSystemWindows偷遗。
對于fitsSystemWindows,官方的說法是“布爾內(nèi)部屬性驼壶,用于根據(jù)系統(tǒng)窗口(如狀態(tài)欄)調(diào)整視圖布局氏豌。如果為true,則調(diào)整此視圖的填充以為系統(tǒng)窗口留出空間热凹。僅在此視圖位于非嵌入活動中時才會生效泵喘。”默認值為false

如果需要創(chuàng)建自定義主題般妙,可將其中一個設(shè)置為父主題背景或者在樣式中添加windowTranslucentNavigation(對應(yīng)WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)與windowTranslucentStatus(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)

Android5.0沉浸式API

在Android5.0開始官方提供了android:statusBarColor (對應(yīng)方法為 setStatusBarColor)纪铺,且窗口必須使用FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS繪制系統(tǒng)欄背景
不得設(shè)置FLAG_TRANSLUCENT_STATUS。

Android9.0全面屏API

Android9.0開始增加對全全面屏的適配
具體增加以下三種標記

LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT(只有當(dāng)DisplayCutout完全包含在系統(tǒng)狀態(tài)欄中時碟渺,才允許窗口延伸到DisplayCutout區(qū)域顯示)
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES(該窗口始終允許延伸到屏幕短邊上的DisplayCutout區(qū)域)
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER(該窗口決不允許與DisplayCutout區(qū)域重疊)

android9.0全面屏沉浸式代碼

        getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN );
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
        getWindow().setAttributes(lp);
        window.setStatusBarColor(Color.TRANSPARENT);

沉浸式分析

以下沉浸式實現(xiàn)以兩種情況做分析分別式圖片沉浸式和ActionBar沉浸式

圖片沉浸式(隱藏狀態(tài)欄圖標)

圖片沉浸式的應(yīng)用相對較多最常見的例如splash頁面

Android 4.4

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);    
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
getWindow().getDecorView().setSystemUiVisibility(system_ui_flag_fullscreen|system_ui_flag_hide_navigation);
image.png

Android 5.0

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);    
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
getWindow().getDecorView().setSystemUiVisibility(system_ui_flag_fullscreen|system_ui_flag_hide_navigation);

同Android4.4

Android 9.0

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
getWindow().setAttributes(lp);
getWindow().getDecorView().setSystemUiVisibility(system_ui_flag_fullscreen|system_ui_flag_hide_navigation);

Android9.0提供新標記(LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES)來適配全面屏鲜锚、劉海屏等異形屏。

ActionBar沉浸式(顯示狀態(tài)欄圖標)

Android 4.4

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);                
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

使用如上代碼 所呈現(xiàn)的UI樣式為:


image.png

可以看出actionBar占住了statusBar的位置苫拍,如果statusBar上有圖標可能會與actionBar重疊烹棉,由于當(dāng)前是在Android4.4上執(zhí)行的demo,不能使用
setStatusBarColor方法怯疤。所以我們可以在actionBar增加一個與statusBar一摸一樣的View浆洗,使之呈現(xiàn)出沉浸式感覺。
具體代碼:

    /**
     * 創(chuàng)建一個與statusBar一樣的View
     * @param color View顏色
     */
    private View createStatusBarView(Activity activity, int color) {
        // 繪制一個和狀態(tài)欄一樣高的矩形
        View statusBarView = new View(activity);
        Log.i(TAG,"statusBarHeight:"+getStatusBarHeight());
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                getStatusBarHeight());
        statusBarView.setLayoutParams(params);
        statusBarView.setBackgroundColor(color);
        return statusBarView;
    }
    /**
     * 獲取statusBar高度
     */
    private int getStatusBarHeight(){
    int height = 0;
        int resourceId = getApplicationContext().getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            height = getApplicationContext().getResources().getDimensionPixelSize(resourceId);
        }
        return height;
    }

    /**
     * setFitsSystemWindows
     */
    private static void setRootView(Activity activity) {
        //獲取到activity_main.xml文件
        ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
        //如果不設(shè)置參數(shù)集峦,會使內(nèi)容顯示到狀態(tài)欄上
        rootView.setFitsSystemWindows(true);
    }
    /**
     * 創(chuàng)建barView
     */
    private void createBarView(int color) {
        //1伏社、創(chuàng)建與statusBar相同高度的view
        View statusView = createStatusBarView(this, color);
        //2抠刺、添加statusView到布局中
        ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView();
        decorView.addView(statusView);
        //3、讓布局適應(yīng)屏幕
        setRootView(this);
    }

直接調(diào)用createBarView方法即可實現(xiàn)效果


image.png

Android 5.0

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)     
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);           
window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));

由于Android 5.0新增API:setStatusBarColor摘昌,直接使用即可

Android 9.0

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)     
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);           
window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末速妖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子聪黎,更是在濱河造成了極大的恐慌罕容,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稿饰,死亡現(xiàn)場離奇詭異锦秒,居然都是意外死亡,警方通過查閱死者的電腦和手機喉镰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門旅择,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侣姆,你說我怎么就攤上這事生真。” “怎么了捺宗?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵柱蟀,是天一觀的道長。 經(jīng)常有香客問我蚜厉,道長产弹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任弯囊,我火速辦了婚禮,結(jié)果婚禮上胶果,老公的妹妹穿的比我還像新娘匾嘱。我一直安慰自己,他們只是感情好早抠,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布霎烙。 她就那樣靜靜地躺著,像睡著了一般蕊连。 火紅的嫁衣襯著肌膚如雪悬垃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天甘苍,我揣著相機與錄音尝蠕,去河邊找鬼。 笑死载庭,一個胖子當(dāng)著我的面吹牛看彼,可吹牛的內(nèi)容都是我干的廊佩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼靖榕,長吁一口氣:“原來是場噩夢啊……” “哼标锄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茁计,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤料皇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后星压,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體践剂,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年租幕,在試婚紗的時候發(fā)現(xiàn)自己被綠了舷手。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡劲绪,死狀恐怖男窟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贾富,我是刑警寧澤歉眷,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站颤枪,受9級特大地震影響汗捡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畏纲,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一扇住、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盗胀,春花似錦艘蹋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屑迂,卻和暖如春浸策,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惹盼。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工庸汗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人手报。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓夫晌,卻偏偏與公主長得像雕薪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晓淀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容