1. 程式人生 > >Android沉浸式狀態列之高仿QQApp

Android沉浸式狀態列之高仿QQApp

伴隨著 Android 5.0 釋出的 Material Design,讓 Android 應用告別了以前的工程師審美,迎來了全新的介面,靈動的互動,也讓越來越多的 App 開始遵從 material design 設計原則,不再是以前拿著iOS設計稿,做著Android開發。本文就其中的沉浸式狀態列這一特性,描述其相容到4.4的實現,以及一些使用中的小細節。現在越來越多的軟體都開始使用沉浸式狀態列了,下面總結一下沉浸式狀態列的兩種使用方法。

首先貼出我用到的程式碼:

package com.seven.etravel.general.utils;
import android.annotation.TargetApi
; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.graphics.Rect; import android.os.Build; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; /** * 沉浸式 * Created by zhy on 15/9/21. */ public class StatusBarCompat { private static final int
INVALID_VAL = -1; private static final int COLOR_DEFAULT = Color.parseColor("#20000000"); @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static void compat(Activity activity, int statusColor) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (statusColor != INVALID_VAL
) { activity.getWindow().setStatusBarColor(statusColor); } return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { int color = COLOR_DEFAULT; ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content); if (statusColor != INVALID_VAL) { color = statusColor; } View statusBarView = contentView.getChildAt(0); //改變顏色時避免重複新增statusBarView if (statusBarView != null && statusBarView.getMeasuredHeight() == getStatusBarHeight(activity)) { statusBarView.setBackgroundColor(color); return; } statusBarView = new View(activity); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); statusBarView.setBackgroundColor(color); contentView.addView(statusBarView, lp); } } /** * 透明沉浸式 */ public static void transparent(Activity activity) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2)// 沉浸式 { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);// 透明狀態列 //activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//透明導航欄 } } /** * 不設定沉浸式 */ public static void compat(Activity activity) { compat(activity, INVALID_VAL); } 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; } public static int getStatusBar2Height(Activity activity) { Rect outRect = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect); return outRect.top; } }

試用方法很便捷只需要一句程式碼。

StatusBarCompat.compat(this, ContextCompat.getColor(this, R.color.gray_line));
或者透明狀態列
StatusBarCompat.transparent(this);
也可以無沉浸式
StatusBarCompat.compat(this);
等等。

感覺就是便捷。簡單。哈哈。

下面講講試用沉浸式遇到的一些問題的分享

1.Android 沉浸式狀態列  Activity兩個Fragment一個是導航是顏色一個是圖片怎麼設定?

這個可以設定為透明沉浸式Activity。然後自己手動實現內容變更。

2.佈局存在輸入框,輸入法彈出後,標題欄被頂上去了。

只需要在使用activiyt的清單檔案加上這句程式碼就不會了。哈哈

android:windowSoftInputMode="adjustResize|stateAlwaysHidden"

3.為什麼該專案加入沉浸式4.4的手機沒有效果


需要在res裡面新增這兩個資源包

4.4的stytle樣式需要設定這個屬性


專案的效果圖分享下


這是模仿qq控制元件沉浸式的效果圖



基本上就分享這些。哈哈。。。有什麼問題或者有什麼錯誤可以留言分享下。

首先感謝原作者無私的分享

下面是我個人修改並自己整理的一個專案。有興趣可以下載。