帶你走進(jìn)沉浸式狀態(tài)欄

什么是沉浸式婴梧?

根據(jù)百度百科上的定義,沉浸式就是要給用戶提供完全沉浸的體驗(yàn)辨绊,使用戶有一種置身于虛擬世界之中的感覺奶栖。
一些橫屏的游戲啊,和一些播放器頁面门坷,通常都會(huì)用到宣鄙,讓用戶不被其他事物所干擾,沉浸其中默蚌,這可能就是目的價(jià)值所在吧冻晤;

下面讓我們一步一步,從最普通的界面绸吸,走進(jìn)沉浸式鼻弧;

1,新寫了個(gè)頁面设江,里面只有一個(gè)imageView控件,設(shè)置充滿攘轩。最普通的界面叉存,認(rèn)識(shí)一下界面的組成。

界面組成

可以看到度帮,沉浸式是要去掉這些導(dǎo)航欄鹉胖,狀態(tài)欄,ActionBar够傍。只顯示主題內(nèi)容甫菠。

2,首先我們隱藏狀態(tài)欄和標(biāo)題欄。

<!-- 第一種冕屯,只支持4.1以上的系統(tǒng)寂诱,去掉action bar 和狀態(tài)欄 (無任何操作效果)-->
public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
       //getWindow().getDecorView()方法獲取到了當(dāng)前界面的DecorView
      View decorView = getWindow().getDecorView();
      然后調(diào)用它的setSystemUiVisibility()方法來設(shè)置系統(tǒng)UI元素的可見性。其中安聘,SYSTEM_UI_FLAG_FULLSCREEN表示全屏的意思痰洒,也就是會(huì)將狀態(tài)欄隱藏。
      int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
      decorView.setSystemUiVisibility(option);
      //另外浴韭,根據(jù)Android的設(shè)計(jì)建議丘喻,ActionBar是不應(yīng)該獨(dú)立于狀態(tài)欄而單獨(dú)顯示的,因此狀態(tài)欄如果隱藏了念颈,我們同時(shí)也需要調(diào)用ActionBar的hide()方法將ActionBar也進(jìn)行隱藏泉粉。
      ActionBar actionBar = getSupportActionBar();
      actionBar.hide();
  }
}

重新運(yùn)行之后;

去掉標(biāo)題欄和狀態(tài)欄

當(dāng)然榴芳,這也不是我們想要的嗡靡。

3,透明的狀態(tài)欄。

首先需要注意窟感,這樣的效果是只有5.0及以上系統(tǒng)才支持讨彼,因此這里先進(jìn)行了一層if判斷,只有系統(tǒng)版本大于或等于5.0的時(shí)候才會(huì)執(zhí)行下面的代碼柿祈。

接下來我們使用了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_STABLE哈误,注意兩個(gè)Flag必須要結(jié)合在一起使用,表示會(huì)讓應(yīng)用的主體內(nèi)容占用系統(tǒng)狀態(tài)欄的空間躏嚎,最后再調(diào)用Window的setStatusBarColor()方法將狀態(tài)欄設(shè)置成透明色就可以了蜜自。

  //第二種 UI Flag 透明背景的狀態(tài)欄
            if (Build.VERSION.SDK_INT >= 21) {
                //效果是只有5.0及以上系統(tǒng)才支持
                View decorView = getWindow().getDecorView();
                int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
                decorView.setSystemUiVisibility(option);
                getWindow().setStatusBarColor(Color.TRANSPARENT);
            }
ActionBar actionBar = getSupportActionBar();
actionBar.hide();

看一下效果:

透明狀態(tài)欄

狀態(tài)欄透明了對(duì)吧,但是我的圖片背景是淺色的紧索,狀態(tài)欄里的圖標(biāo)顏色是白色的袁辈,并不顯眼菜谣,看起來不明確怎么辦珠漂?加兩行代碼晚缩,搞定,不過只支持6.0以上

            //只支持6.0以上的系統(tǒng)媳危;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    this.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                }

或者在style屬性中:

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

國內(nèi)三方Android系統(tǒng)都有深色狀態(tài)欄字體模式荞彼,但是目前只看到了小米和魅族公開了各自的實(shí)現(xiàn)方法,支持底層Android4.4以上的版本待笑。而Android官方在6.0版本才有了深色狀態(tài)欄字體API鸣皂。

效果

黑色圖標(biāo)

4,好的,看完?duì)顟B(tài)欄暮蹂,我們看一下底部這個(gè)導(dǎo)航欄寞缝,首先隱藏導(dǎo)航欄。

其實(shí)實(shí)現(xiàn)的原理都是一樣的仰泻,隱藏導(dǎo)航欄也就是使用了不同的UI Flag而已荆陆,修改MainActivity中的代碼,如下所示:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(option);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();

這里我們同時(shí)使用了SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN集侯,這樣就可以將狀態(tài)欄和導(dǎo)航欄同時(shí)隱藏了”惶洌現(xiàn)在重新運(yùn)行一下程序,效果如圖所示棠枉。

全屏模式

但是呢浓体,這次看上去好像終于是完全全屏化了,但其實(shí)上這離真正的沉浸式模式還差得比較遠(yuǎn)辈讶,因?yàn)樵谶@種模式下命浴,我們觸摸屏幕的任意位置都會(huì)退出全屏。


點(diǎn)擊退出全屏

我們也可以把狀態(tài)欄和導(dǎo)航欄都設(shè)成透明色贱除,如下所示:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 21) {
    View decorView = getWindow().getDecorView();
    int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    decorView.setSystemUiVisibility(option);
    getWindow().setNavigationBarColor(Color.TRANSPARENT);
    getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();

這里使用了SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION咳促,表示會(huì)讓應(yīng)用的主體內(nèi)容占用系統(tǒng)導(dǎo)航欄的空間,然后又調(diào)用了setNavigationBarColor()方法將導(dǎo)航欄設(shè)置成透明色】彼牛現(xiàn)在重新運(yùn)行一下程序跪腹,效果如下圖所示。

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

5,真正的沉浸式飞醉。

首先你應(yīng)該確定自己是否真的需要這個(gè)功能冲茸,因?yàn)槌讼裼螒蚧蛘咭曨l軟件這類特殊的應(yīng)用,大多數(shù)的應(yīng)用程序都是用不到沉浸式模式的缅帘。

當(dāng)你確定要使用沉浸式模式轴术,那么只需要重寫Activity的onWindowFocusChanged()方法,然后加入如下邏輯即可:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @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_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }
}

沉浸式模式的UI Flag就這些钦无,也沒什么好解釋的逗栽,如果你需要實(shí)現(xiàn)沉浸式模式,直接將上面的代碼復(fù)制過去就行了失暂。需要注意的是彼宠,只有在Android 4.4及以上系統(tǒng)才支持沉浸式模式鳄虱,因此這里也是加入了if判斷。

另外凭峡,為了讓我們的界面看上去更像是游戲拙已,這里我將MainActivity設(shè)置成了橫屏模式:

<activity android:name=".MainActivity" android:screenOrientation="landscape"> 
...
</activity>
真正的沉浸式.gif

可以看到,界面默認(rèn)情況下是全屏的摧冀,狀態(tài)欄和導(dǎo)航欄都不會(huì)顯示倍踪。而當(dāng)我們需要用到狀態(tài)欄或?qū)Ш綑跁r(shí),只需要在屏幕頂部向下拉索昂,或者在屏幕右側(cè)向左拉建车,狀態(tài)欄和導(dǎo)航欄就會(huì)顯示出來,此時(shí)界面上任何元素的顯示或大小都不會(huì)受影響椒惨。過一段時(shí)間后如果沒有任何操作癞志,狀態(tài)欄和導(dǎo)航欄又會(huì)自動(dòng)隱藏起來,重新回到全屏狀態(tài)框产。

這就是最標(biāo)準(zhǔn)的沉浸式模式

貼一下代碼:

<a>https://github.com/WKaKa/Feed/tree/master/Immerse</a>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凄杯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秉宿,更是在濱河造成了極大的恐慌戒突,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件描睦,死亡現(xiàn)場(chǎng)離奇詭異膊存,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忱叭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門隔崎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人韵丑,你說我怎么就攤上這事爵卒。” “怎么了撵彻?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵钓株,是天一觀的道長。 經(jīng)常有香客問我陌僵,道長轴合,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任碗短,我火速辦了婚禮受葛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己总滩,他們只是感情好纲堵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咳秉,像睡著了一般婉支。 火紅的嫁衣襯著肌膚如雪鸯隅。 梳的紋絲不亂的頭發(fā)上澜建,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蝌以,去河邊找鬼炕舵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跟畅,可吹牛的內(nèi)容都是我干的咽筋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼徊件,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼奸攻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起虱痕,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤睹耐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后部翘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硝训,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年新思,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窖梁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夹囚,死狀恐怖纵刘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荸哟,我是刑警寧澤彰导,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站敲茄,受9級(jí)特大地震影響位谋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堰燎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一掏父、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秆剪,春花似錦赊淑、人聲如沸爵政。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钾挟。三九已至,卻和暖如春饱岸,著一層夾襖步出監(jiān)牢的瞬間掺出,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工苫费, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汤锨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓百框,卻偏偏與公主長得像闲礼,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铐维,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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