国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 實現沉浸式狀態欄的方法

2020-04-11 11:26:21
字體:
來源:轉載
供稿:網友

沉浸式狀態欄的來源就是很多手機用的是實體按鍵,沒有虛擬鍵,于是開了沉浸模式就只有狀態欄消失了。于是沉浸模式成了沉浸式狀態欄。

我們先來看下具體的效果

開啟沉浸模式后,狀態欄消失,從頂部向下滑動,狀態欄出現,退出沉浸模式,狀態欄也出現了。

我們的代碼基于前一篇文章。首先是兩個開啟沉浸模式和關閉沉浸模式的函數

@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的開發者文檔中找到,可以看這里Using Immersive Full-Screen Mode,上面的代碼是在Android 4.4中才會生效,對應的Android版本兼容的判斷請自行處理。

此外還需要一個輔助函數,用于獲得狀態欄高度,使用反射獲得。

/** * 獲狀態欄高度 * * @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按鈕進入沉浸模式,也就是隱藏狀態欄,隱藏狀態欄的同時我們需要修改Toolbar的上內邊距,否則會顯得很難看,這里注冊一個監聽OnSystemUiVisibilityChangeListener,當進入沉浸模式后我們改變Toolbar的上內邊距

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()); } }); }});

進入沉浸模式后,手指從屏幕頂部向下劃,狀態欄就出現了,過2秒左右它又會自動消失。

點擊show按鈕退出沉浸模式,同時Toolbar的內邊距也要增加到狀態欄的高度。

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這個類進行的狀態欄的著色,除上方的操作外,還要在對應的監聽里增加狀態欄著色的禁止和啟動的功能。

進入沉浸模式,要禁用

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來判斷當前的系統版本是否是android4.4以上,如果是就啟用代碼,如果不是則跳過不執行。

以上就是本文的全部內容,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙陵县| 从江县| 怀来县| 峡江县| 陕西省| 如皋市| 铁力市| 荥阳市| 宁海县| 霍林郭勒市| 靖西县| 新化县| 延吉市| 葵青区| 商洛市| 曲阳县| 濉溪县| 庆安县| 谷城县| 铜鼓县| 册亨县| 安福县| 安达市| 扎鲁特旗| 全南县| 水富县| 保德县| 邻水| 综艺| 达州市| 日喀则市| 巨鹿县| 邻水| 淮南市| 东兴市| 体育| 泗洪县| 永康市| 丁青县| 元朗区| 安平县|