android實現沉浸式
㈠ android studio怎麼做沉浸式狀態欄
答:沉浸式通知欄Android4.4以上才支持的新特性。4.3不支持。 具體實現方式如下: 1.新建個公共style,設置android:fitsSystemWindows=true true 2. 修改AndroidManifest.xml,讓所有的activity樣式默認設置為AppBaseTheme(*不同項目要靈活處理,筆...
㈡ Android 沉浸式/透明式狀態欄、導航欄
Android 從4.4開始引進透明狀態欄和導航欄的概念,並且在5.0進行了改進,將透明變成了半透明的效果。雖然此特性最早出現在ios,但不否認效果還是很贊的。
至於4.4以下的手機,就不要考慮此特性了,好在4.4以下的手機份額已經非常小了。
我們先來看一下透明狀態欄的實現,兩種常見效果圖如下:
虛擬導航欄並不是所有的手機都有,華為的手機多比較常見,就是上圖屏幕底部按鈕那塊區域。設置導航欄和狀態欄類似:
這是官方的解釋,大致意思就是我們在布局的最外層設置 android:fitsSystemWindows="true",會在屏幕最上方預留出狀態欄高度的padding。
由於fitsSystemWindows屬性本質上是給當前控制項設置了一個padding,所以我們設置到根布局的話,會導致狀態欄是透明的,並且和窗口背景一樣。
但是多數情況,我們並不在根布局設置這個屬性,我們想要的無外乎是讓內容沉浸在狀態欄之中。所以我們經常設置在最上端的圖片背景、Banner之類的,如果是Toolbar的,我們可以使用一層LinearLayout包裹,並把這個屬性設置給LinearLayout,這樣就可以避免Toolbar的內容下沉了。如:
上述方法可以解決普通頁面的透明式狀態欄需求,如有復雜需求可以參考下面這些:
Android 系統狀態欄沉浸式/透明化完整解決方案
Android 沉浸式狀態欄的實現
Android沉浸式狀態欄(透明狀態欄)最佳實現
還有開源庫推薦: ImmersionBar
㈢ Android QQ沉浸式狀態欄效果是怎麼實現的
首先是兩個開啟沉浸模式和關閉沉浸模式的函數
?
@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的上內邊距,否則會顯得很難看,這里注冊一個監聽,當進入沉浸模式後咱們改變Toolbar的上內邊距
?
hide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = getWindow().getDecorView();
hideSystemUI(view);
mToolbar.set(new View.() {
@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.set(new View.() {
@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中怎麼實現沉浸式狀態欄
styles.xml設置如下:
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="windowActionModeOverlay">true</item>
<item name="android:actionModeBackground">@drawable/context_menu</item>
</style>
<style name="TranslucentTheme" parent="AppTheme.NoActionBar">
</style>
V21的styles.xml設置如下:
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:">true</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:statusBarColor">@color/colorPrimary</item>
<item name="windowActionModeOverlay">true</item>
<item name="android:actionModeBackground">@drawable/context_menu</item>
</style>
<style name="TranslucentTheme" parent="AppTheme.NoActionBar">
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">false</item>
</style>
再在要顯示的toolbar里加上屬性:
android:fitsSystemWindows="true"
主題的屬性設置為:
<style name="TranslucentTheme" parent="AppTheme.NoActionBar">