android4.4以上沉浸式狀態(tài)欄和導(dǎo)航欄實(shí)現(xiàn)以及Bar的其他管理

HeLe小子拽
自從android4.4開始癣猾,android手機(jī)狀態(tài)欄再也不是一成黑的時(shí)代敛劝,之前叫做變色龍,miui6發(fā)布會(huì)把他叫做沉浸式纷宇,之后大家就自然而然的接受了沉浸式這個(gè)名稱夸盟,其實(shí)實(shí)際應(yīng)該叫做Translucent Bar,即為透明狀態(tài)欄像捶。
??沉浸式實(shí)現(xiàn)原理其實(shí)是使整個(gè)activity布局延伸到整個(gè)屏幕上陕,然后使?fàn)顟B(tài)欄變成透明色桩砰,有些手機(jī)會(huì)有導(dǎo)航欄,同樣也可以把導(dǎo)航欄變成透明色释簿,這樣會(huì)使一些app更加美觀亚隅。

先看兩個(gè)概念

  • 狀態(tài)欄

    image
  • 導(dǎo)航欄

    image

1、引入

github倉庫地址:https://github.com/gyf-dev/ImmersionBar

image
dependencies {
    compile 'com.gyf.barlibrary:barlibrary:2.3.0'
}

2庶溶、特性

1)基本介紹

基礎(chǔ)用法煮纵,建議在BaseActivity里調(diào)用

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ImmersionBar.with(this).init(); //初始化,默認(rèn)透明狀態(tài)欄和黑色導(dǎo)航欄
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ImmersionBar.with(this).destroy(); //不調(diào)用該方法偏螺,如果界面bar發(fā)生改變行疏,在不關(guān)閉app的情況下,退出此界面再進(jìn)入將記憶最后一次bar改變的狀態(tài)
    }
}
  • 高級(jí)用法套像,如果基礎(chǔ)用法不能滿足你的需求隘擎,可以試試這里的方法
ImmersionBar.with(this)
                 .transparentStatusBar()  //透明狀態(tài)欄,不寫默認(rèn)透明色
                 .transparentNavigationBar()  //透明導(dǎo)航欄凉夯,不寫默認(rèn)黑色(設(shè)置此方法,fullScreen()方法自動(dòng)為true)
                 .transparentBar()             //透明狀態(tài)欄和導(dǎo)航欄采幌,不寫默認(rèn)狀態(tài)欄為透明色劲够,導(dǎo)航欄為黑色(設(shè)置此方法,fullScreen()方法自動(dòng)為true)
                 .statusBarColor(R.color.colorPrimary)     //狀態(tài)欄顏色休傍,不寫默認(rèn)透明色
                 .navigationBarColor(R.color.colorPrimary) //導(dǎo)航欄顏色征绎,不寫默認(rèn)黑色
                 .barColor(R.color.colorPrimary)  //同時(shí)自定義狀態(tài)欄和導(dǎo)航欄顏色,不寫默認(rèn)狀態(tài)欄為透明色磨取,導(dǎo)航欄為黑色
                 .statusBarAlpha(0.3f)  //狀態(tài)欄透明度人柿,不寫默認(rèn)0.0f
                 .navigationBarAlpha(0.4f)  //導(dǎo)航欄透明度,不寫默認(rèn)0.0F
                 .barAlpha(0.3f)  //狀態(tài)欄和導(dǎo)航欄透明度忙厌,不寫默認(rèn)0.0f
                 .statusBarDarkFont(true)   //狀態(tài)欄字體是深色凫岖,不寫默認(rèn)為亮色
                 .flymeOSStatusBarFontColor(R.color.btn3)  //修改flyme OS狀態(tài)欄字體顏色
                 .fullScreen(true)      //有導(dǎo)航欄的情況下,activity全屏顯示逢净,也就是activity最下面被導(dǎo)航欄覆蓋哥放,不寫默認(rèn)非全屏
                 .hideBar(BarHide.FLAG_HIDE_BAR)  //隱藏狀態(tài)欄或?qū)Ш綑诨騼烧撸粚懩J(rèn)不隱藏
                 .addViewSupportTransformColor(toolbar)  //設(shè)置支持view變色爹土,可以添加多個(gè)view甥雕,不指定顏色,默認(rèn)和狀態(tài)欄同色胀茵,還有兩個(gè)重載方法
                 .titleBar(view)    //解決狀態(tài)欄和布局重疊問題社露,任選其一
                 .statusBarView(view)  //解決狀態(tài)欄和布局重疊問題,任選其一
                 .fitsSystemWindows(true)    //解決狀態(tài)欄和布局重疊問題琼娘,任選其一峭弟,默認(rèn)為false附鸽,當(dāng)為true時(shí)一定要指定statusBarColor(),不然狀態(tài)欄為透明色
                 .supportActionBar(true) //支持ActionBar使用
                 .statusBarColorTransform(R.color.orange)  //狀態(tài)欄變色后的顏色
                 .navigationBarColorTransform(R.color.orange) //導(dǎo)航欄變色后的顏色
                 .barColorTransform(R.color.orange)  //狀態(tài)欄和導(dǎo)航欄變色后的顏色
                 .removeSupportView(toolbar)  //移除指定view支持
                 .removeSupportAllView() //移除全部view支持
                 .addTag("tag")  //給以上設(shè)置的參數(shù)打標(biāo)記
                 .getTag("tag")  //根據(jù)tag獲得沉浸式參數(shù)
                 .reset()  //重置所以沉浸式參數(shù)
                 .keyboardEnable(true)  //解決軟鍵盤與底部輸入框沖突問題孟害,默認(rèn)為false
                 .setOnKeyboardListener(new OnKeyboardListener() {    //軟鍵盤監(jiān)聽回調(diào)
                   @Override
                   public void onKeyboardChange(boolean isPopup, int keyboardHeight) {
                       LogUtils.e(isPopup);  //isPopup為true拒炎,軟鍵盤彈出,為false挨务,軟鍵盤關(guān)閉
                   }
              })
                 .keyboardMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)  //單獨(dú)指定軟鍵盤模式
                 .init();  //必須調(diào)用方可沉浸式

2)詳細(xì)介紹

解決狀態(tài)欄和布局頂部重合

上面已經(jīng)說了击你,沉浸式原理就是使整個(gè)布局延伸到狀態(tài)欄和導(dǎo)航欄,既然這樣必然導(dǎo)致一個(gè)問題谎柄,就是狀態(tài)欄和布局頂部重疊丁侄,直接看圖

https://upload-images.jianshu.io/upload_images/4776932-7f0f212167b8c81c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700

眼神好的同學(xué)已經(jīng)看到上圖中給了五種解決方案啦,在這里說一下

1?? 使用dimen自定義狀態(tài)欄高度

在values-v19/dimens.xml文件下

 <dimen name="status_bar_height">25dp</dimen>

在values/dimens.xml文件下

    <dimen name="status_bar_height">0dp</dimen>

然后在布局界面添加view標(biāo)簽朝巫,高度指定為status_bar_height

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:app="http://schemas.android.com/apk/res-auto"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:background="@color/darker_gray"
       android:orientation="vertical">
   
       <View
           android:layout_width="match_parent"
           android:layout_height="@dimen/status_bar_height"
           android:background="@color/colorPrimary" />
   
       <android.support.v7.widget.Toolbar
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:background="@color/colorPrimary"
           app:title="方法一"
           app:titleTextColor="@android:color/white" />
   </LinearLayout>

2?? 使用系統(tǒng)的fitsSystemWindows屬性

在布局文件的根節(jié)點(diǎn)使用android:fitsSystemWindows="true"屬性

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

然后使用ImmersionBar時(shí)候必須指定狀態(tài)欄顏色

   ImmersionBar.with(this)
         .statusBarColor(R.color.colorPrimary)
         .init();

3?? 使用ImmersionBar的fitsSystemWindows(boolean fits)方法
實(shí)現(xiàn)原理是獲得rootView的根節(jié)點(diǎn)鸿摇,然后設(shè)置距離頂部的padding值為狀態(tài)欄的高度值

    ImmersionBar.with(this)
        .statusBarColor(R.color.colorPrimary)
        .fitsSystemWindows(true)  //使用該屬性必須指定狀態(tài)欄的顏色,不然狀態(tài)欄透明劈猿,很難看
        .init();

4?? 使用ImmersionBar的statusBarView(View view)方法

在標(biāo)題欄的上方增加View標(biāo)簽(也可以為其他標(biāo)簽)拙吉,高度指定為0dp

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:app="http://schemas.android.com/apk/res-auto"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="@color/darker_gray"
           android:orientation="vertical">
       
           <View
               android:layout_width="match_parent"
               android:layout_height="0dp"
               android:background="@color/colorPrimary" />
       
           <android.support.v7.widget.Toolbar
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:background="@color/colorPrimary"
               app:title="方法四"
               app:titleTextColor="@android:color/white" />
    </LinearLayout>

然后使用ImmersionBar的statusBarView方法,指定view就可以啦揪荣,實(shí)現(xiàn)原理:ImmersionBar獲取狀態(tài)欄的高度筷黔,傳入view,設(shè)置高度為獲取到的狀態(tài)欄高度

 ImmersionBar.with(this)
           .statusBarView(view)
           .init();

5?? 使用ImmersionBar的titleBar(View view)方法

        ImmersionBar.with(this)
                  .titleBar(view) //指定標(biāo)題欄view
                  .init();

總結(jié):這五種方法仗颈,任選其一使用就可以了佛舱,不要一起使用哦,根據(jù)項(xiàng)目而定挨决,比如有側(cè)邊欄的请祖,建議使用第1??種或者第4??種或者第5??種,最后來一張效果圖

image.png
  • 在Fragment中實(shí)現(xiàn)沉浸式

注意:2.2.6版本已將ImmersionFragment這個(gè)類標(biāo)記為過時(shí)脖祈,請(qǐng)用戶自行使用懶加載方式實(shí)現(xiàn)

  • 在Fragment使用ImmersionBar

    第一種肆捕,當(dāng)結(jié)合viewpager使用的時(shí)候,請(qǐng)使用懶加載的形式撒犀,參考demo中的BaseLazyFragment這個(gè)類
    第二種福压,當(dāng)使用show()和hide()來控制Fragment顯示隱藏的時(shí)候,參考demo中的BaseTwoFragment這個(gè)類

    注意:

    • 2.2.7版本以后別忘了在Fragment的onDestroy方法里銷毀沉浸式了或舞,2.2.7版本之前不需要調(diào)用
@Override
   protected void onDestroy() {
       super.onDestroy();
       if (mImmersionBar != null)
          mImmersionBar.destroy();  
   }

以show()和hide()方式控制Fragment顯示隱藏荆姆,別忘了重寫onHiddenChanged方法,如下

@Override
     public void onHiddenChanged(boolean hidden) {
         super.onHiddenChanged(hidden);
         if (!hidden && mImmersionBar != null)
            mImmersionBar.init();
     }

  • 在Activity使用ImmersionBar

    第一種映凳,當(dāng)結(jié)合viewpager使用的時(shí)候胆筒,請(qǐng)使用viewpager的addOnPageChangeListener的方法監(jiān)聽沉浸式,參考demo中FragmentThreeActivity這個(gè)類
    第二種,當(dāng)使用show()和hide()來控制Fragment顯示隱藏的時(shí)候仆救,請(qǐng)?jiān)趖ab切換的時(shí)候使用ImmersionBar抒和,參考demo中FragmentFourActivity這個(gè)類
    • 使用Fragment第三方框架Fragmentation實(shí)現(xiàn)沉浸式
    參考demo中FragmentFiveActivityBaseFiveFragment這個(gè)類
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市彤蔽,隨后出現(xiàn)的幾起案子摧莽,更是在濱河造成了極大的恐慌,老刑警劉巖顿痪,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镊辕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蚁袭,警方通過查閱死者的電腦和手機(jī)征懈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揩悄,“玉大人卖哎,你說我怎么就攤上這事∩拘裕” “怎么了亏娜?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹬挺。 經(jīng)常有香客問我照藻,道長,這世上最難降的妖魔是什么汗侵? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮群发,結(jié)果婚禮上晰韵,老公的妹妹穿的比我還像新娘。我一直安慰自己熟妓,他們只是感情好雪猪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著起愈,像睡著了一般只恨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抬虽,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天官觅,我揣著相機(jī)與錄音,去河邊找鬼阐污。 笑死休涤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播功氨,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼序苏,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了捷凄?” 一聲冷哼從身側(cè)響起丹墨,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤第练,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體见咒,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年冠蒋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了殉疼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牛曹,死狀恐怖佛点,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黎比,我是刑警寧澤超营,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站阅虫,受9級(jí)特大地震影響演闭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颓帝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一米碰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧购城,春花似錦吕座、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侮攀,卻和暖如春锣枝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兰英。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工撇叁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畦贸。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓税朴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子正林,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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