Android 實(shí)現(xiàn)沉浸式狀態(tài)欄的方法
沉浸式狀態(tài)欄的來源就是很多手機(jī)用的是實(shí)體按鍵,沒有虛擬鍵,于是開了沉浸模式就只有狀態(tài)欄消失了。于是沉浸模式成了沉浸式狀態(tài)欄。
我們先來看下具體的效果
開啟沉浸模式后,狀態(tài)欄消失,從頂部向下滑動(dòng),狀態(tài)欄出現(xiàn),退出沉浸模式,狀態(tài)欄也出現(xiàn)了。
我們的代碼基于前一篇文章。首先是兩個(gè)開啟沉浸模式和關(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中才會(huì)生效,對(duì)應(yīng)的Android版本兼容的判斷請(qǐng)自行處理。
此外還需要一個(gè)輔助函數(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; }
點(diǎn)擊hide按鈕進(jìn)入沉浸模式,也就是隱藏狀態(tài)欄,隱藏狀態(tài)欄的同時(shí)我們需要修改Toolbar的上內(nèi)邊距,否則會(huì)顯得很難看,這里注冊(cè)一個(gè)監(jiān)聽OnSystemUiVisibilityChangeListener,當(dāng)進(jìn)入沉浸模式后我們改變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()); } }); } });
進(jìn)入沉浸模式后,手指從屏幕頂部向下劃,狀態(tài)欄就出現(xiàn)了,過2秒左右它又會(huì)自動(dòng)消失。
點(diǎn)擊show按鈕退出沉浸模式,同時(shí)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這個(gè)類進(jìn)行的狀態(tài)欄的著色,除上方的操作外,還要在對(duì)應(yīng)的監(jiān)聽里增加狀態(tài)欄著色的禁止和啟動(dòng)的功能。
進(jìn)入沉浸模式,要禁用
tintManager.setStatusBarTintEnabled(false);
退出沉浸模式,要啟動(dòng)
tintManager.setStatusBarTintEnabled(true);
如果你想更加平滑,則可以對(duì)padding的改成增加動(dòng)畫,具體動(dòng)畫效果自行添加。
切記在使用沉浸模式前記得判斷Android的版本。SYSTEM_UI_FLAG_IMMERSIVE_STICKY只能在大于等于API Level 19使用。你要兼容低版本的同時(shí)使用沉浸模式。在使用SYSTEM_UI_FLAG_IMMERSIVE_STICKY之前先用android.os.Build.VERSION.SDK_INT來判斷當(dāng)前的系統(tǒng)版本是否是android4.4以上,如果是就啟用代碼,如果不是則跳過不執(zhí)行。
以上就是本文的全部內(nèi)容,希望大家喜歡。
- Android 沉浸式狀態(tài)欄與隱藏導(dǎo)航欄實(shí)例詳解
- 解決Android 沉浸式狀態(tài)欄和華為虛擬按鍵沖突問題
- Android之沉浸式狀態(tài)欄的實(shí)現(xiàn)方法、狀態(tài)欄透明
- Android沉浸式狀態(tài)欄微技巧(帶你真正理解沉浸式模式)
- Android 4.4以上"沉浸式"狀態(tài)欄效果的實(shí)現(xiàn)方法
- Android App仿QQ制作Material Design風(fēng)格沉浸式狀態(tài)欄
- Android編程中沉浸式狀態(tài)欄的三種實(shí)現(xiàn)方式詳解
- Android 高仿QQ 沉浸式狀態(tài)欄
- 另外兩種Android沉浸式狀態(tài)欄實(shí)現(xiàn)思路
- Android實(shí)現(xiàn)沉浸式狀態(tài)欄功能
相關(guān)文章
模仿美團(tuán)點(diǎn)評(píng)的Android應(yīng)用中價(jià)格和購買欄懸浮固定的效果
這篇文章主要介紹了模仿美團(tuán)點(diǎn)評(píng)的Android應(yīng)用中價(jià)格和購買欄懸浮固定的效果,文章后半還針對(duì)快速滑動(dòng)操作給出了一個(gè)響應(yīng)優(yōu)化的方法,需要的朋友可以參考下2016-04-04android 控件同時(shí)監(jiān)聽單擊和雙擊實(shí)例
這篇文章主要介紹了android 控件同時(shí)監(jiān)聽單擊和雙擊實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08Android中LayoutInflater.inflater()的正確打開方式
這篇文章主要給大家介紹了關(guān)于Android中LayoutInflater.inflater()的正確打開方式,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12Android9.0上針對(duì)Toast的特殊處理圖文詳解
這篇文章主要給大家介紹了關(guān)于Android9.0上針對(duì)Toast的特殊處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Android獲取手機(jī)號(hào)碼和運(yùn)營商信息的方法
這篇文章主要介紹了Android獲取手機(jī)號(hào)碼和運(yùn)營商信息的方法,以實(shí)例形式完整講述了獲取手機(jī)號(hào)碼和運(yùn)營商信息的技巧,代碼中包含完整的注釋說明,需要的朋友可以參考下2015-01-01android實(shí)現(xiàn)簡(jiǎn)單音樂播放器
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)簡(jiǎn)單音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12android編程之menu按鍵功能實(shí)現(xiàn)方法
這篇文章主要介紹了android編程之menu按鍵功能實(shí)現(xiàn)方法,實(shí)例分析了Android實(shí)現(xiàn)menu的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Flutter自定義實(shí)現(xiàn)神奇動(dòng)效的卡片切換視圖的示例代碼
這篇文章主要介紹了Flutter自定義實(shí)現(xiàn)神奇動(dòng)效的卡片切換視圖的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04Flutter 利用CustomScrollView實(shí)現(xiàn)滑動(dòng)效果
我們可以使用ListView將幾個(gè)GridView組合在一起實(shí)現(xiàn)了不同可滑動(dòng)組件的粘合,但是這里必須要設(shè)置禁止 GridView 的滑動(dòng),防止多個(gè)滑動(dòng)組件的沖突。這種方式寫起來不太方便,事實(shí)上 Flutter 提供了 CustomScrollView 來粘合多個(gè)滑動(dòng)組件,并且可以實(shí)現(xiàn)更有趣的滑動(dòng)效果。2021-06-06