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)欄
-
導(dǎo)航欄
1、引入
github倉庫地址:https://github.com/gyf-dev/ImmersionBar
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)欄和布局頂部重疊丁侄,直接看圖
眼神好的同學(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??種,最后來一張效果圖
-
在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中FragmentFiveActivity和BaseFiveFragment這個(gè)類