編輯:關於Android編程
什麼是沉浸式狀態欄?
沉浸式狀態欄意思指狀態欄的顏色隨著軟件顏色而改變,使狀態欄和軟件顏色保持一致,沉浸其中!當我們打開應用程序時,不會再因為看到應用程序和狀態欄的黑邊相隔開而感到十分難看。沉浸式狀態欄由於其能給用戶群體帶來極佳的用戶體驗,已經在越來越多的應用上得到了體現。
實現原理
從4.4後系統增加了透明狀態欄的特性WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS一旦添加上這個屬性後,那麼布局中的內容
DecorView就會自動填充到狀態欄。所有的實現都是基於這個特性,就相當於這個時候狀態欄會默認空出來,然後開發者可以自定義view來填充這個高度的.
實現的過程中可能還要用到android:fitsSystemWindows="true" ,這個屬性很重要。其含義:view可以根據系統窗口(如status bar,軟鍵盤)來調整自己的布局,如果值為true,就會調整view的paingding屬性來給system windows留出空間....
那麼現在來看看具體實現方式吧

一般頁面都是自己定義個類標題欄
實現
從實現效果上,這裡大致分為兩種
1、單獨給狀態欄著色
使用這個開源庫SystemBarTint
/**
* 狀態欄顏色設置方法
* @param context
* @param color
*/
public static void smartTintManager(Activity context, int color){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = context.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 創建狀態欄的管理實例
SystemBarTintManager tintManager = new SystemBarTintManager(context);
// 激活狀態欄設置
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintColor(color);
}
}
在對應的頁面的根布局中添加android:fitsSystemWindows="true" ,且根布局中不能設置整體的大背景色,否則狀態欄著色就會被覆蓋
調用上面方法設置具體的顏色(依據開源庫,其中就一個核心類,可以直接把那個類拷貝到項目中)
這裡主要講一下具體的實現原理
private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {
mStatusBarTintView = new View(context);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());
params.gravity = Gravity.TOP;
if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {
params.rightMargin = mConfig.getNavigationBarWidth();
}
mStatusBarTintView.setLayoutParams(params);
mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
mStatusBarTintView.setVisibility(View.GONE);
decorViewGroup.addView(mStatusBarTintView);
}
通過這段代碼,很容易看出,通過動態生成一個view,然後這個view寬是MATCH_PARENT , 高度是系統狀態欄的高度;然後為這個動態生成的view設置一個背景顏色;最後將這個view添加到decorViewGroup這個view容器中,那再看看這個view到底是誰
/**
* Constructor. Call this in the host activity onCreate method after its
* content view has been set. You should always create new instances when
* the host activity is recreated.
*
* @param activity The host activity.
*/
@TargetApi(19)
public SystemBarTintManager(Activity activity) {
Window win = activity.getWindow();
//獲得DecorView根布局容器
ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();
.....
if (mStatusBarAvailable) {
// 這個view容器是decorViewGroup
setupStatusBarView(activity, decorViewGroup);
}
if (mNavBarAvailable) {
setupNavBarView(activity, decorViewGroup);
}
}
注意看上面兩個我手動添加的注釋,可見,這種做法思想就是狀態欄透明後,向根布局decorViewGroup中添加一個和狀態欄等高度的view。至於你讓這個view是什麼顏色,那就隨你心情了。
2、用標題欄的背景色來填充狀態欄
將狀態欄設置為半透明的,此時出現的問題是下面的內容會占據了狀態欄。
如果我們在activity的根布局添加 android:fitsSystemWindows="true"
那麼此時狀態欄還是可以看見的,並沒有占據。那這個屬性的作用就在此了。
此時我們借助狀態欄的高度,為下面的內容設置一個padding-top距離(因為狀態欄半透明後,下面的內容會占據原有的狀態欄,那麼將其設置一個padding的狀態欄高度即可)這樣設置後,在這個view的背景的padding下,原有的狀態欄高度填充了同樣的背景色,那麼這樣的話就貌似所謂的沉浸式了
這種方式說白了,就是狀態欄半透明後,用下面的內容來合適的填充(因為默認半透明會是被占據)
代碼如下:
@SuppressLint("InlinedApi")
public static void setImmerseLayout(Activity context, View view) {
if (context == null || view == null) {
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = context.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
int statusBarHeight = getStatusBarHeight(context.getBaseContext());
view.setPadding(0, statusBarHeight, 0, 0);
}
}
/**
* 用於獲取狀態欄的高度。 使用Resource對象獲取(推薦這種方式)
*
* @return 返回狀態欄高度的像素值。
*/
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
對這個view設置一個padding_top,而這個padding的距離剛好是狀態欄的高度,那麼這個view的背景就填充到了狀態欄了。
值得注意的是:這個標題欄的高度一定要是wrap_content,因為如果是具體的高度,然後在設置個paddingtop的話,那麼就會把部分標題欄的內容擠出去了,不完整了。
所以通常的做法是將原有的標題欄外面在嵌套一個<FrameLayout /> ,然後將標題欄背景設置成<FrameLayout />的背景色
<FrameLayout android:id="@+id/title" android:layout_width="match_parent" android:background="@color/common_theme_color" android:layout_height="wrap_content">
總結
關於沉浸式效果的實現方式就到這了,希望這篇文章的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家也可以留言交流。
Android之——獲取手機安裝的應用程序
前幾篇有關Android的博文中,向大家介紹了幾個項目中常用的實用功能,那麼在這篇博文中,我將向大家介紹如何獲取Android手機中已經安裝的手機應用程序,實用過金山手機
Android應用程序的編譯流程及使用Ant編譯項目的攻略
Android 工程構建的持續集成,需要搭建一套編譯和打包自動化流程,比如建立每日構建系統、自動生成發布文件等等。這些都需要我們對Android工程的編譯和打包有一個比較
Android 編程之入門開發文件夾管理器開發文件的過濾與排序-3
前面說了文件操作和主界面,接下來說說文件的過濾和排序,我們都知道在我們的設備裡,不管是PC還是手機,總有一些我們 看不到的文件夾,那就是所謂的隱藏文件,大部分的隱藏文件,
Android 使用jarsigner給apk簽名的方法詳細介紹
Android 使用jarsigner給apk簽名的方法詳細介紹工作中APP功能完成以後往往需要往應用商店提交一些內容,如商店中存在本公司別的人員提交的APP,往往需要進