public class StatusBarUtil {
public static final String STATUS_BAR_TAG = "statusBar";
public static final int DEFAULT_STATUS_BAR_ALPHA = 112;
private static final int FAKE_TRANSLUCENT_VIEW_ID = R.id.statusbarutil_translucent_view;
private static final int TAG_KEY_HAVE_SET_OFFSET = -123;
/**
* 設(shè)置狀態(tài)欄顏色
*
* @param activity 需要設(shè)置的 activity
* @param color 狀態(tài)欄顏色值
*/
public static void setColor(Activity activity, @ColorInt int color) {
setColor(activity, color, false);
}
public static void setColor(Activity activity, @ColorInt int color, boolean useAlpha) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().setStatusBarColor(calculateStatusColor(color, useAlpha ? Color.alpha(color) : 0));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(createStatusBarView(activity, color, useAlpha ? Color.alpha(color) : 0));
setRootView(activity);
}
}
/**
* 設(shè)置狀態(tài)欄顏色
*
* @param activity 需要設(shè)置的 activity
*/
public static void setColor(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(createStatusBarView(activity, Color.TRANSPARENT, 0));
setRootView(activity);
}
}
//應(yīng)用內(nèi)容占用系統(tǒng)狀態(tài)欄的空間
public static void setFullScreen(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.x開始需要把顏色設(shè)置透明,否則導(dǎo)航欄會(huì)呈現(xiàn)系統(tǒng)默認(rèn)的淺灰色
Window window = activity.getWindow();
View decorView = window.getDecorView();
//兩個(gè) flag 要結(jié)合使用,表示讓應(yīng)用的主體內(nèi)容占用系統(tǒng)狀態(tài)欄的空間
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
//導(dǎo)航欄顏色也可以正常設(shè)置
// window.setNavigationBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = activity.getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
// int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
attributes.flags |= flagTranslucentStatus;
// attributes.flags |= flagTranslucentNavigation;
window.setAttributes(attributes);
}
}
public static void setTransparentBar(Activity activity) {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
// activity.getWindow().getDecorView().setSystemUiVisibility(
// View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
// activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
// } else
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
//狀態(tài)欄背景透明
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
for (int i = 0; i < decorView.getChildCount(); i++) {
View view = decorView.getChildAt(i);
if (STATUS_BAR_TAG.equals(view.getTag())) {
decorView.removeViewAt(i);
return;
}
}
}
}
public static void setImage(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.0及以上坝撑,不設(shè)置透明狀態(tài)欄愉择,設(shè)置會(huì)有半透明陰影
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//是activity_main。xml中的圖片可以沉浸到狀態(tài)欄上
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//設(shè)置狀態(tài)欄顏色透明膊畴。
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
for (int i = 0; i < decorView.getChildCount(); i++) {
View view = decorView.getChildAt(i);
if (STATUS_BAR_TAG.equals(view.getTag())) {
decorView.removeViewAt(i);
return;
}
}
}
}
public static int getStatusBarHeight(Context context) {
int result = 0;
int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
result = context.getResources().getDimensionPixelSize(resId);
}
return result;
}
/**
* 生成一個(gè)和狀態(tài)欄大小相同的半透明矩形條
*
* @param activity 需要設(shè)置的activity
* @param color 狀態(tài)欄顏色值
* @param alpha 透明值
* @return 狀態(tài)欄矩形條
*/
private static View createStatusBarView(Activity activity, @ColorInt int color, int alpha) {
// 繪制一個(gè)和狀態(tài)欄一樣高的矩形
View statusBarView = new View(activity);
statusBarView.setTag(STATUS_BAR_TAG);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
return statusBarView;
}
/**
* 設(shè)置根布局參數(shù)
*/
private static void setRootView(Activity activity) {
ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);
for (int i = 0, count = parent.getChildCount(); i < count; i++) {
View childView = parent.getChildAt(i);
if (childView instanceof ViewGroup) {
childView.setFitsSystemWindows(true);
((ViewGroup) childView).setClipToPadding(true);
}
}
}
/**
* 計(jì)算狀態(tài)欄顏色
*
* @param color color值
* @param alpha alpha值
* @return 最終的狀態(tài)欄顏色
*/
private static int calculateStatusColor(@ColorInt int color, int alpha) {
if (alpha == 0) {
return color;
}
float a = 1 - alpha / 255f;
int red = color >> 16 & 0xff;
int green = color >> 8 & 0xff;
int blue = color & 0xff;
red = (int) (red * a + 0.5);
green = (int) (green * a + 0.5);
blue = (int) (blue * a + 0.5);
return 0xff << 24 | red << 16 | green << 8 | blue;
}
/**
* StatusBar設(shè)置為透明時(shí)掘猿,調(diào)用此方法給ToolBar 加padding
*/
public static void setStatusBarPadding(Toolbar toolbar) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
// 不支持 4.4以下設(shè)備
return;
}
if (toolbar == null) {
return;
}
ViewGroup.LayoutParams layoutParams = toolbar.getLayoutParams();
int statusBarHeight = getStatusBarHeight(toolbar.getContext());
layoutParams.height = (int) toolbar.getContext().getResources().getDimension(R.dimen.actionbar_height) + (statusBarHeight);
toolbar.setPadding(0, statusBarHeight, 0, 0);
}
/**
* 使?fàn)顟B(tài)欄半透明
* <p>
* 適用于圖片作為背景的界面,此時(shí)需要圖片填充到狀態(tài)欄
*
* @param activity 需要設(shè)置的activity
*/
public static void setTranslucent(Activity activity) {
setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);
}
/**
* 使?fàn)顟B(tài)欄半透明
* <p>
* 適用于圖片作為背景的界面,此時(shí)需要圖片填充到狀態(tài)欄
*
* @param activity 需要設(shè)置的activity
* @param statusBarAlpha 狀態(tài)欄透明度
*/
public static void setTranslucent(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
setTransparent(activity);
addTranslucentView(activity, statusBarAlpha);
}
/**
* 設(shè)置狀態(tài)欄全透明
*
* @param activity 需要設(shè)置的activity
*/
public static void setTransparent(Activity activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
transparentStatusBar(activity);
setRootView(activity);
}
/**
* 為頭部是 ImageView 的界面設(shè)置狀態(tài)欄全透明
*
* @param activity 需要設(shè)置的activity
* @param needOffsetView 需要向下偏移的 View
*/
public static void setTransparentForImageView(Activity activity, View needOffsetView) {
setTranslucentForImageView(activity, 0, needOffsetView);
}
/**
* 為頭部是 ImageView 的界面設(shè)置狀態(tài)欄透明(使用默認(rèn)透明度)
*
* @param activity 需要設(shè)置的activity
* @param needOffsetView 需要向下偏移的 View
*/
public static void setTranslucentForImageView(Activity activity, View needOffsetView) {
setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);
}
/**
* 為頭部是 ImageView 的界面設(shè)置狀態(tài)欄透明
*
* @param activity 需要設(shè)置的activity
* @param statusBarAlpha 狀態(tài)欄透明度
* @param needOffsetView 需要向下偏移的 View
*/
public static void setTranslucentForImageView(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha,
View needOffsetView) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
setTransparentForWindow(activity);
addTranslucentView(activity, statusBarAlpha);
if (needOffsetView != null) {
Object haveSetOffset = needOffsetView.getTag(TAG_KEY_HAVE_SET_OFFSET);
if (haveSetOffset != null && (Boolean) haveSetOffset) {
return;
}
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams();
layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin + getStatusBarHeight(activity),
layoutParams.rightMargin, layoutParams.bottomMargin);
needOffsetView.setTag(TAG_KEY_HAVE_SET_OFFSET, true);
}
}
/**
* 設(shè)置透明
*/
private static void setTransparentForWindow(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
activity.getWindow()
.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow()
.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
/**
* 添加半透明矩形條
*
* @param activity 需要設(shè)置的 activity
* @param statusBarAlpha 透明值
*/
private static void addTranslucentView(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) {
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
View fakeTranslucentView = contentView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);
if (fakeTranslucentView != null) {
if (fakeTranslucentView.getVisibility() == View.GONE) {
fakeTranslucentView.setVisibility(View.VISIBLE);
}
fakeTranslucentView.setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0));
} else {
contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));
}
}
/**
* 使?fàn)顟B(tài)欄透明
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
private static void transparentStatusBar(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
} else {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
/**
* 創(chuàng)建半透明矩形 View
*
* @param alpha 透明值
* @return 半透明 View
*/
private static View createTranslucentStatusBarView(Activity activity, int alpha) {
// 繪制一個(gè)和狀態(tài)欄一樣高的矩形
View statusBarView = new View(activity);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));
statusBarView.setId(FAKE_TRANSLUCENT_VIEW_ID);
return statusBarView;
}
}
status bar處理工具類
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門兼砖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人既棺,你說我怎么就攤上這事讽挟。” “怎么了丸冕?”我有些...
- 文/不壞的土叔 我叫張陵耽梅,是天一觀的道長。 經(jīng)常有香客問我胖烛,道長眼姐,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任佩番,我火速辦了婚禮众旗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趟畏。我一直安慰自己贡歧,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布赋秀。 她就那樣靜靜地躺著利朵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猎莲。 梳的紋絲不亂的頭發(fā)上绍弟,一...
- 文/蒼蘭香墨 我猛地睜開眼展鸡,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼屿衅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起莹弊,我...
- 序言:老撾萬榮一對(duì)情侶失蹤涤久,失蹤者是張志新(化名)和其女友劉穎涡尘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體响迂,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡考抄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔗彤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片川梅。...
- 正文 年R本政府宣布丢早,位于F島的核電站,受9級(jí)特大地震影響秧倾,放射性物質(zhì)發(fā)生泄漏怨酝。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一那先、第九天 我趴在偏房一處隱蔽的房頂上張望农猬。 院中可真熱鬧,春花似錦售淡、人聲如沸斤葱。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽苦掘。三九已至换帜,卻和暖如春楔壤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惯驼。 一陣腳步聲響...
- 正文 我出身青樓隙畜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親说贝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子议惰,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 一、關(guān)于navigation controller 和 navigation bar的使用 1.頁面隱藏navig...
- Android一些設(shè)備都有上下兩條bar运杭,我們可以獲取這些bar的信息夫啊。原文地址:http://www.cnblo...
- 概述 通常來說,System bars(包含status bar和navigation bar辆憔,如下圖所示撇眯, 1代...
- self.navigationController.navigationBar.barTintColor
- 隨著時(shí)代的進(jìn)步,網(wǎng)絡(luò)日益豐富的今天虱咧,想成為互聯(lián)網(wǎng)教師首先要習(xí)慣互聯(lián)網(wǎng)思維熊榛,互聯(lián)網(wǎng)思維的本質(zhì)是極致、專注腕巡、口...