快速實(shí)現(xiàn)沉浸式狀態(tài)欄,沉浸式,你復(fù)制這篇代碼就夠用了!

關(guān)于沉浸式的定義,這里不作爭(zhēng)論...

透明狀態(tài)欄,透明導(dǎo)航欄

通過(guò)主題配置

styles.xml

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"/>
    
</resources>

res下新建values-v19,values-v21文件夾

values-v19下添加styles.xml

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- 表示狀態(tài)欄透明,并且會(huì)使得狀態(tài)欄懸浮在activity之上(activity布局會(huì)擴(kuò)展到狀態(tài)欄底部) -->
        <item name="android:windowTranslucentStatus">true</item>
        <!-- 表示導(dǎo)航欄半透明,并且會(huì)使得狀態(tài)欄和導(dǎo)航欄都懸浮在activity之上 -->
        <item name="android:windowTranslucentNavigation">true</item>
    </style>

</resources>

values-v21下添加styles.xml

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- 表示狀態(tài)欄透明讥蔽,并且會(huì)使得狀態(tài)欄懸浮在activity之上(activity布局會(huì)擴(kuò)展到狀態(tài)欄底部) -->
        <item name="android:windowTranslucentStatus">false</item>
        <!-- 表示導(dǎo)航欄半透明拧略,并且會(huì)使得狀態(tài)欄和導(dǎo)航欄都懸浮在activity之上 -->
        <item name="android:windowTranslucentNavigation">true</item>
        <!--Android 5.x開(kāi)始需要把顏色設(shè)置透明绷杜,否則導(dǎo)航欄會(huì)呈現(xiàn)系統(tǒng)默認(rèn)的顏色-->
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>

</resources>

OK,我們看下我們的布局,然后看效果,布局隨便寫(xiě)的,就是一個(gè)ScrollView套了一張圖而已

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#1478d5"
            android:orientation="vertical">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/a"/>

        </LinearLayout>

    </ScrollView>

</LinearLayout>
16a01313-a35f-4878-a67e-a7f210feb8e9.jpg

下面我們看下效果:


afd915cc-8edb-40c4-b23d-574ce8d8f426.jpg

[========]

使用代碼實(shí)現(xiàn)

當(dāng)然,記得styles.xml保留下NoActionBar

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"/>

</resources>

    protected void initBar() {
        
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上
            //獲取頂級(jí)窗口
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN      //全屏標(biāo)志,布局侵入
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION    //標(biāo)志布局會(huì)侵入到導(dǎo)航欄下
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;            //保持穩(wěn)定
            decorView.setSystemUiVisibility(option);                //設(shè)置系統(tǒng)UI可見(jiàn)屬性

            getWindow().setStatusBarColor(Color.TRANSPARENT);       //設(shè)置狀態(tài)欄顏色透明
            getWindow().setNavigationBarColor(Color.TRANSPARENT);   //設(shè)置導(dǎo)航欄顏色透明
            
            //設(shè)置狀態(tài)欄為半透明
            //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //設(shè)置導(dǎo)航欄為半透明
            //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0
            WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
            localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
                    localLayoutParams.flags);
        }
        
    }

效果如下:


9712d183-a7e9-48af-8f29-931497dd88f1.jpg

附贈(zèng):窗口的層級(jí)的經(jīng)典圖片

2dd9d60f-d3ec-448e-ad0d-6b7545d7a8e6.jpg

當(dāng)然,你也可以設(shè)置導(dǎo)航欄為別的顏色
例如:

            getWindow().setStatusBarColor(Color.parseColor("#581478d5"));       //設(shè)置狀態(tài)欄顏色
            getWindow().setNavigationBarColor(Color.parseColor("#581478d5"));   //設(shè)置導(dǎo)航欄顏色
67eeb26c-288d-4be5-90ff-6e9c322416a9.jpg

或者你把這兩句代碼去掉,直接設(shè)置或者在主題編輯器中修改

31efaed5-8aff-40f9-b796-49cf0ad4b08a.jpg

af4a3412-9848-4142-9bd7-cf62c58a9216.png

8011c522-4876-40cc-85a9-cb67b2971df9.png

效果如下:


880fba6c-44d5-4e6b-8425-36bc9b88436a.jpg

附贈(zèng)另一張經(jīng)典圖片:

c1f94172-5565-4d03-80a6-2a43c1e89978.jpg

[========]

有時(shí)候我們不想讓布局中的內(nèi)容也侵入到狀態(tài)欄怎么辦呢?
加個(gè)margin或padding唄!

3ad656d9-c091-48ea-9ac5-9d84acfb8305.png

效果如下:


GIFa.gif

等等walle9,我的特么的為什么是白乎乎的?

哈哈,難道你沒(méi)看到我早已在LinearLayout上添加了一個(gè)顏色?...

可是我還有個(gè)問(wèn)題,我就想讓magin的值跟狀態(tài)欄的高度一樣怎么做呀?

嗯!寫(xiě)成30試試....或者代碼中算一下高度唄!

其實(shí)我們還可以使用android:fitsSystemWindows這個(gè)屬性來(lái)設(shè)置.


fitsSystemWindows只作用在sdk>=19的系統(tǒng)上就是高于4.4的系統(tǒng)
這個(gè)屬性可以給任何view設(shè)置,只要設(shè)置了這個(gè)屬性此view的所有padding屬性失效.

只有在設(shè)置了透明狀態(tài)欄(StatusBar)或者導(dǎo)航欄(NavigationBar)此屬性才會(huì)生效
同時(shí),所有設(shè)置了android:fitsSystemWindows=”true”屬性的view會(huì)自動(dòng)添加一個(gè)值等于狀態(tài)欄高度的paddingTop,會(huì)自動(dòng)添加一個(gè)值等于導(dǎo)航欄高度的paddingBottom

來(lái)唄!試一下!

e913da09-c16a-496a-9c1c-0d3a557c482e.png
0429ea57-4e1c-4072-a134-4b8b70519723.jpg

頂出來(lái)了,有木有!

日了狗了!你又騙老子!

騷年啊!我沒(méi)有騙你啊!下面的margin咱們忘記去掉了不是么!再試一下好咯!

bfb43129-ab04-4c9a-8254-a5866251c88f.png
75445770-1892-465b-96be-2bfc73974715.jpg

恩恩!這次一樣大了!


聽(tīng)說(shuō)使用android:fitsSystemWindows="true"這個(gè)屬性的view中的padding值會(huì)失效,咱們?cè)囋噯h!

先試padding值:


2c1a4570-a4b5-4519-92c1-f8688a9715ba.png

效果如下:


47424171-3fe1-4d7e-96b7-0767b9562e63.jpg

加上android:fitsSystemWindows="true"

a735eed0-a46a-4d0f-b805-0286192db2c8.png

效果如下:


59e01256-491a-404e-812b-4a052cf096b1.jpg

但是,需要注意哦,在我們滑動(dòng)到最底部的時(shí)候,底部導(dǎo)航也會(huì)出現(xiàn)一個(gè)padding值,如果你介意的話,那就用magin或padding來(lái)設(shè)置.寫(xiě)個(gè)相近值或者代碼中計(jì)算具體值.

cad549a9-5ea2-44df-9a55-0a5a4f4df19c.jpg

下面我們?cè)诖a中計(jì)算:
沒(méi)啥好說(shuō)的,先設(shè)置一個(gè)id....


6f062734-eda1-4481-8866-99b4fbfe977e.png

當(dāng)然,你愿意在最外層那個(gè)linearlayout上面設(shè)置也可以,你高興就好!

代碼中找到這個(gè)控件,計(jì)算出狀態(tài)欄的高度,設(shè)置padding...

    private void initStatusBar() {
        int statusBarHeight = getStatusBarHeight();
        LinearLayout ll =findViewById(R.id.ll);
        ll.setPadding(0,statusBarHeight,0,0);
    }

獲取狀態(tài)欄高度:

    private int getStatusBarHeight() {
        int result = 0;
        int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId > 0) {
            result = getResources().getDimensionPixelSize(resId);
        }
        return result;
    }

再次附贈(zèng):獲取導(dǎo)航欄高度

    public float getNavigationBarHeight() {
        float result = 0;
        int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimension(resourceId);
        }
        return result;
    }

效果如下:


cb256216-7df2-4c57-9e9f-4ef1ef718291.jpg

[========]

沉浸式

并不是所有的手機(jī)都像華為那樣自帶隱藏虛擬導(dǎo)航鍵的功能,虛擬導(dǎo)航鍵擋住了布局的底部導(dǎo)航怎么辦呢?

騷年!看這里!自動(dòng)隱藏導(dǎo)航...

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY        //粘性沉浸體驗(yàn)
                    |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //布局侵入導(dǎo)航
                    |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION        //隱藏導(dǎo)航
                    //|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN      //全屏標(biāo)記,布局侵入
                    //|View.SYSTEM_UI_FLAG_FULLSCREEN             //隱藏狀態(tài)欄
                    |View.SYSTEM_UI_FLAG_LAYOUT_STABLE          //保持穩(wěn)定
            );
        }
    }

效果如下:


GIFb.gif

自動(dòng)隱藏狀態(tài)欄:

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY        //粘性沉浸體驗(yàn)
                            |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //布局侵入導(dǎo)航
                            //|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION        //隱藏導(dǎo)航
                            |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN      //全屏標(biāo)記,布局侵入
                            |View.SYSTEM_UI_FLAG_FULLSCREEN             //隱藏狀態(tài)欄
                            |View.SYSTEM_UI_FLAG_LAYOUT_STABLE          //保持穩(wěn)定
            );
        }
    }

效果如下:


GIFc.gif

機(jī)智的你早已放開(kāi)了一切...
那么恭喜你,你學(xué)會(huì)了沉浸式...

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY        //粘性沉浸體驗(yàn)
                            |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //布局侵入導(dǎo)航
                            |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION        //隱藏導(dǎo)航
                            |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN      //全屏標(biāo)記,布局侵入
                            |View.SYSTEM_UI_FLAG_FULLSCREEN             //隱藏狀態(tài)欄
                            |View.SYSTEM_UI_FLAG_LAYOUT_STABLE          //保持穩(wěn)定
            );
        }
    }

效果如下:


GIFd.gif

over...
上傳圖片不容易,且復(fù)制且珍惜吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岛蚤,一起剝皮案震驚了整個(gè)濱河市酝锅,隨后出現(xiàn)的幾起案子闹炉,更是在濱河造成了極大的恐慌蒿赢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渣触,死亡現(xiàn)場(chǎng)離奇詭異羡棵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嗅钻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)皂冰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人养篓,你說(shuō)我怎么就攤上這事秃流。” “怎么了柳弄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵舶胀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我碧注,道長(zhǎng)嚣伐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任萍丐,我火速辦了婚禮纤控,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碉纺。我一直安慰自己船万,他們只是感情好刻撒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著耿导,像睡著了一般声怔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舱呻,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天醋火,我揣著相機(jī)與錄音,去河邊找鬼箱吕。 笑死芥驳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茬高。 我是一名探鬼主播兆旬,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怎栽!你這毒婦竟也來(lái)了丽猬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熏瞄,失蹤者是張志新(化名)和其女友劉穎脚祟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體强饮,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡由桌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邮丰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沥寥。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柠座,靈堂內(nèi)的尸體忽然破棺而出邑雅,到底是詐尸還是另有隱情,我是刑警寧澤妈经,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布淮野,位于F島的核電站,受9級(jí)特大地震影響吹泡,放射性物質(zhì)發(fā)生泄漏骤星。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一爆哑、第九天 我趴在偏房一處隱蔽的房頂上張望洞难。 院中可真熱鬧,春花似錦揭朝、人聲如沸队贱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柱嫌。三九已至锋恬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間编丘,已是汗流浹背与学。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘉抓,地道東北人索守。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抑片,于是被迫代替她去往敵國(guó)和親卵佛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355