Android 實現(xiàn)沉浸式狀態(tài)欄的方法
沉浸式狀態(tài)欄的來源就是很多手機用的是實體按鍵,沒有虛擬鍵,于是開了沉浸模式就只有狀態(tài)欄消失了。于是沉浸模式成了沉浸式狀態(tài)欄。
我們先來看下具體的效果

開啟沉浸模式后,狀態(tài)欄消失,從頂部向下滑動,狀態(tài)欄出現(xiàn),退出沉浸模式,狀態(tài)欄也出現(xiàn)了。
我們的代碼基于前一篇文章。首先是兩個開啟沉浸模式和關(guān)閉沉浸模式的函數(shù)
@SuppressLint("NewApi")
public static void hideSystemUI(View view) {
view.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);
}
@SuppressLint("NewApi")
public static void showSystemUI(View view) {
view.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
這些代碼可以在google的開發(fā)者文檔中找到,可以看這里Using Immersive Full-Screen Mode,上面的代碼是在Android 4.4中才會生效,對應(yīng)的Android版本兼容的判斷請自行處理。
此外還需要一個輔助函數(shù),用于獲得狀態(tài)欄高度,使用反射獲得。
/**
* 獲狀態(tài)欄高度
*
* @param context 上下文
* @return 通知欄高度
*/
public int getStatusBarHeight(Context context) {
int statusBarHeight = 0;
try {
Class<?> clazz = Class.forName("com.android.internal.R$dimen");
Object obj = clazz.newInstance();
Field field = clazz.getField("status_bar_height");
int temp = Integer.parseInt(field.get(obj).toString());
statusBarHeight = context.getResources().getDimensionPixelSize(temp);
} catch (Exception e) {
e.printStackTrace();
}
return statusBarHeight;
}
點擊hide按鈕進入沉浸模式,也就是隱藏狀態(tài)欄,隱藏狀態(tài)欄的同時我們需要修改Toolbar的上內(nèi)邊距,否則會顯得很難看,這里注冊一個監(jiān)聽OnSystemUiVisibilityChangeListener,當進入沉浸模式后我們改變Toolbar的上內(nèi)邊距
hide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = getWindow().getDecorView();
hideSystemUI(view);
mToolbar.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
mToolbar.setPadding(mToolbar.getPaddingLeft(), 0,mToolbar.getPaddingRight(), mToolbar.getPaddingBottom());
}
});
}
});
進入沉浸模式后,手指從屏幕頂部向下劃,狀態(tài)欄就出現(xiàn)了,過2秒左右它又會自動消失。
點擊show按鈕退出沉浸模式,同時Toolbar的內(nèi)邊距也要增加到狀態(tài)欄的高度。
show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = getWindow().getDecorView();
showSystemUI(view);
mToolbar.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
mToolbar.setPadding(mToolbar.getPaddingLeft(), getStatusBarHeight(MainActivity.this),mToolbar.getPaddingRight(), mToolbar.getPaddingBottom());
}
});
}
});
具體效果見上方的效果圖。
如果使用的是SystemBarTintManager這個類進行的狀態(tài)欄的著色,除上方的操作外,還要在對應(yīng)的監(jiān)聽里增加狀態(tài)欄著色的禁止和啟動的功能。
進入沉浸模式,要禁用
tintManager.setStatusBarTintEnabled(false);
退出沉浸模式,要啟動
tintManager.setStatusBarTintEnabled(true);
如果你想更加平滑,則可以對padding的改成增加動畫,具體動畫效果自行添加。
切記在使用沉浸模式前記得判斷Android的版本。SYSTEM_UI_FLAG_IMMERSIVE_STICKY只能在大于等于API Level 19使用。你要兼容低版本的同時使用沉浸模式。在使用SYSTEM_UI_FLAG_IMMERSIVE_STICKY之前先用android.os.Build.VERSION.SDK_INT來判斷當前的系統(tǒng)版本是否是android4.4以上,如果是就啟用代碼,如果不是則跳過不執(zhí)行。
以上就是本文的全部內(nèi)容,希望大家喜歡。
- Android 沉浸式狀態(tài)欄與隱藏導(dǎo)航欄實例詳解
- 解決Android 沉浸式狀態(tài)欄和華為虛擬按鍵沖突問題
- Android之沉浸式狀態(tài)欄的實現(xiàn)方法、狀態(tài)欄透明
- Android沉浸式狀態(tài)欄微技巧(帶你真正理解沉浸式模式)
- Android 4.4以上"沉浸式"狀態(tài)欄效果的實現(xiàn)方法
- Android App仿QQ制作Material Design風(fēng)格沉浸式狀態(tài)欄
- Android編程中沉浸式狀態(tài)欄的三種實現(xiàn)方式詳解
- Android 高仿QQ 沉浸式狀態(tài)欄
- 另外兩種Android沉浸式狀態(tài)欄實現(xiàn)思路
- Android實現(xiàn)沉浸式狀態(tài)欄功能
相關(guān)文章
模仿美團點評的Android應(yīng)用中價格和購買欄懸浮固定的效果
這篇文章主要介紹了模仿美團點評的Android應(yīng)用中價格和購買欄懸浮固定的效果,文章后半還針對快速滑動操作給出了一個響應(yīng)優(yōu)化的方法,需要的朋友可以參考下2016-04-04
Android中LayoutInflater.inflater()的正確打開方式
這篇文章主要給大家介紹了關(guān)于Android中LayoutInflater.inflater()的正確打開方式,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Flutter自定義實現(xiàn)神奇動效的卡片切換視圖的示例代碼
這篇文章主要介紹了Flutter自定義實現(xiàn)神奇動效的卡片切換視圖的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
Flutter 利用CustomScrollView實現(xiàn)滑動效果
我們可以使用ListView將幾個GridView組合在一起實現(xiàn)了不同可滑動組件的粘合,但是這里必須要設(shè)置禁止 GridView 的滑動,防止多個滑動組件的沖突。這種方式寫起來不太方便,事實上 Flutter 提供了 CustomScrollView 來粘合多個滑動組件,并且可以實現(xiàn)更有趣的滑動效果。2021-06-06

