Android透明狀態列多版本適應開發總結

2021-09-13 21:31:48 字數 3793 閱讀 4945

效果:

第一種思路:

利用window將宣告status可繪製,相關param屬性為flag_draw_system_bar_backgrouds呼叫window.setstatusbarcorlor()將status顏色設定成actionbar顏色

這種方法有一定的侷限性,滿足*******為單一顏色的情況,當*******顏色背景為漸變色/時無法適用。

**實現:

// activity中

if(build.version.sdk_int >= build.version_codes.lollipop)

第二種

通常配合*******使用,關於隱藏actionbar新增*******的方法不是本篇重點,這裡不進行贅述。

思路:將status設為半透明,在系統布局中加上乙個view充當status的背景

// activity中

private view mstatusview;

private

void

add*******transparent()

}/** 通過resource獲取status高度 **/

private

intgetstatusbarheight()

return statusbarheight;

}

該方法設定透明狀態列的好處是可以任意處理我們新增的statusview,比如乙個activity中多個fragment切換時*******顏色跟著切換,status設定為背景、漸變色等。

但該方法也有一定侷限性,由於我們給window設定的標籤flag_translucent_status是將狀態列設定為半透明,可讓低版本的status全透明,但高版本機型會出現以下情況

這時我們需要利用decorview的兩個標籤system_ui_flag_layout_fullscreensystem_ui_flag_layout_stable,並結合decorview#setstatuscolor()(5.0以上)將狀態列設定為完全透明,並將fitssystemwindows設為true。

**實現基於上面5.0以下的適配**。

private

void

add*******transparent()

最後,當狀態列字型需要從黑色變為淺色時,可以呼叫以下方法

if (build.version.sdk_int >= build.version_codes.m)
當*******為單一顏色且只需適配5.0以上機型時,用第一種方法,直接將status設為應用狀態列顏色,省時省力。

當需要適配低版本時或者需要status設為背景時,用第二種方法,雖然麻煩一點,但靈活性相對高一些。

setfitssystemwindows:即使用者檢視(user_content)為status預留空間,當設為false時,會是使用者檢視會全屏顯示。如下(相當難看)

getwindow().addflags(windowmanager.layoutparams.flag_translucent_status) : 這個標籤會將status設為半透明,在高版本機型中是半透明形式顯示,但在低版本中是全透明(通常用於適配低版本手機)。筆者測試小公尺5.0是全透明顯示。

decorview的結構,上面多次用到decorview,那麼decorview的結構是如何的呢?我們通過以下**找出其結構關係

private

void

printview

(viewgroup viewgroup)

for(

int i =

0; i < viewgroup.

getchildcount()

; i++)}

}// oncreate()中呼叫

printview

((viewgroup)

getwindow()

.getdecorview()

);// 列印日誌如下

printview: viewgroup:decorview

printview: childview:linearlayout

printview: viewgroup:linearlayout

printview: childview:viewstub

printview: childview:framelayout

printview: viewgroup:framelayout

printview: childview:fitwindowslinearlayout

printview: viewgroup:fitwindowslinearlayout

printview: childview:viewstubcompat

printview: childview:contentframelayout

printview: viewgroup:contentframelayout

printview: childview:view

printview: childview:linearlayout

printview: viewgroup:linearlayout

printview: childview:*******

printview: viewgroup:*******

根據列印日誌畫出decorview的結構圖,如下:

在設定透明狀態列的方法中,我們用下面方法找到的布局屬於那一層呢?

viewgroup systemcontent = findviewbyid(android.r.id.content);

viewgroup usercontent = (viewgroup) systemcontent.getchildat(0);

一樣用日誌打出

log.d(tag, "add*******transparent: systemcontent / " + systemcontent.getclass().get******name());

log.d(tag, "add*******transparent: usercontent / " + usercontent.getclass().get******name());

// 輸出日誌如下

add*******transparent: systemcontent / contentframelayout

add*******transparent: usercontent / linearlayout

參考 關於android狀態列開發那幾件事

Android透明狀態列 沉浸式狀態列

注意 android版本 4.4此方法有效 第一步 在activity的布局檔案中,根布局中加入以下第5 7行 第二步 新建類kitkatutils.class package cn.powerthink.djt.utils import android.annotation.suppresslin...

android 狀態列浸透 狀態列半透明

純 設定,不用修改manifest 首先這是主介面.xml 兩種情況 第一種 去掉xml中 style 效果 主介面置頂,可以實現半透明效果 activity oncreat 中 狀態列沉浸,4.4 生效 if build.version.sdk int build.version codes.ki...

Android全透明狀態列

直接在setcontentview r.layout.activity main 之前新增以下 getwindow requestfeature window.feature no title if build.version.sdk int build.version codes.lollipop...