效果:
第一種思路:
利用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_fullscreen
和system_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...