Android KITKAT 以上實(shí)現(xiàn)沉浸式狀態(tài)欄

  • 代碼未行玛界,效果先上

Flyme4.2 Android4.4.4上運(yùn)行效果
  • 如何實(shí)現(xiàn)

在 [KITKAT][null-link] 之后棵逊,Android Window支持了一些新的屬性伤疙,其中有兩個(gè)是這樣的 .

WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION

正如它們的變量名的意思,使用這兩個(gè)屬性辆影,可以使得狀態(tài)欄和導(dǎo)航欄變?yōu)橥该魍较瘢瑢?dǎo)航欄指的就是Android下方的三大按鍵,當(dāng)然只使用第一個(gè)屬性也可以達(dá)到今天所要完成的效果蛙讥。下面的示例代碼將使?fàn)顟B(tài)欄和導(dǎo)航欄變得透明

  @Override
  protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       initWindow();
  }
 @TargetApi(19)
 private void initWindow(){
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
           getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);   
    }

直接運(yùn)行之后锯蛀,狀態(tài)欄直接透明了,但是并不是我們想要的效果次慢,狀態(tài)欄原本應(yīng)該占有的位置沒了旁涤。


Flyme4.2 Android4.4.4上運(yùn)行效果

這個(gè)問題也很好解決,在 style theme 添加

<item name="android:fitsSystemWindows">true</item>

之后我們?cè)龠\(yùn)行迫像,卻又發(fā)現(xiàn)劈愚,狀態(tài)欄的位置出來了,但是闻妓。菌羽。。

Flyme4.2 Android4.4.4上運(yùn)行效果

實(shí)際上由缆,狀態(tài)欄已經(jīng)透明了注祖,只是狀態(tài)欄底下沒有顏色呀!
Google 了之后在 Github 找到了一個(gè)開源項(xiàng)目 SystemBarTint 均唉,代碼就變成下面這個(gè)樣子:

   private SystemBarTintManager tintManager;
   @TargetApi(19)
   private void initWindow(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            tintManager = new SystemBarTintManager(this);
            tintManager.setStatusBarTintColor(getColor(R.color.app_main_color));
            tintManager.setStatusBarTintEnabled(true);
        }
    }

運(yùn)行之后是晨,發(fā)現(xiàn)運(yùn)行效果跟第一張圖一樣,達(dá)到我們想要的效果了舔箭。

跟蹤進(jìn)去查看 SystemBarTint 的源代碼罩缴,會(huì)發(fā)現(xiàn) SystemBarTintManager 的構(gòu)造方法里面除了獲取 ActionBar 的高度等等這些配置之外,還有一個(gè)重要的方法 setupStatusBarView

    @TargetApi(19)
    public SystemBarTintManager(Activity activity) {
        Window win = activity.getWindow();
        ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        //省去部分代碼...
        if (mStatusBarAvailable) {
            setupStatusBarView(activity, decorViewGroup);
        }
        if (mNavBarAvailable) {
            setupNavBarView(activity, decorViewGroup);
        }
    }

于是接著查看 setupStatusBarView 的代碼

private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {
        mStatusBarTintView = new View(context);
        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());
        params.gravity = Gravity.TOP;
        if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {
            params.rightMargin = mConfig.getNavigationBarWidth();
        }
        mStatusBarTintView.setLayoutParams(params);
        mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
        mStatusBarTintView.setVisibility(View.GONE);
        decorViewGroup.addView(mStatusBarTintView);
    }

可以發(fā)現(xiàn)這個(gè)開源項(xiàng)目能夠解決我們的問題的原因在這,就是往 DecorView 加入一個(gè) View靴庆, 而在代碼中我們將這個(gè) View 的背景設(shè)置成 ActionBar 一樣的顏色时捌,所以就達(dá)到了沉浸式的效果。到這里炉抒,基本也就分析完成了奢讨。

  • 源代碼

附上源代碼地址: Github 源代碼 .
項(xiàng)目是我最近剛建不久的,主要放了一些 Android 方面的練習(xí)焰薄,最近更新了[RecycleView滾動(dòng)時(shí)隱藏Toolbar和狀態(tài)欄拿诸,類似pocket][null-link] 和 [滑動(dòng)菜單欄,支持設(shè)置左右滑動(dòng)呼出][null-link]
[null-link]: chrome://not-a-link

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末塞茅,一起剝皮案震驚了整個(gè)濱河市亩码,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌野瘦,老刑警劉巖描沟,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鞭光,居然都是意外死亡吏廉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門惰许,熙熙樓的掌柜王于貴愁眉苦臉地迎上來席覆,“玉大人,你說我怎么就攤上這事汹买∨迳耍” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵晦毙,是天一觀的道長生巡。 經(jīng)常有香客問我,道長结序,這世上最難降的妖魔是什么障斋? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮徐鹤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邀层。我一直安慰自己返敬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布寥院。 她就那樣靜靜地躺著劲赠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凛澎,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天霹肝,我揣著相機(jī)與錄音,去河邊找鬼塑煎。 笑死沫换,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的最铁。 我是一名探鬼主播讯赏,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼冷尉!你這毒婦竟也來了漱挎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤雀哨,失蹤者是張志新(化名)和其女友劉穎磕谅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雾棺,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膊夹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垢村。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片割疾。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嘉栓,靈堂內(nèi)的尸體忽然破棺而出宏榕,到底是詐尸還是另有隱情,我是刑警寧澤侵佃,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布麻昼,位于F島的核電站,受9級(jí)特大地震影響馋辈,放射性物質(zhì)發(fā)生泄漏抚芦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一迈螟、第九天 我趴在偏房一處隱蔽的房頂上張望叉抡。 院中可真熱鬧,春花似錦答毫、人聲如沸褥民。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽消返。三九已至载弄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撵颊,已是汗流浹背宇攻。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倡勇,地道東北人逞刷。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像译隘,于是被迫代替她去往敵國和親亲桥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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