Last active
April 13, 2018 11:01
-
-
Save BCsl/8aa482359fd4a90959aeae25d0b0f008 to your computer and use it in GitHub Desktop.
状态栏着色工具类,不需要再繁琐的配style
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* https://github.com/niorgai/StatusBarCompat | |
* */ | |
public class StatusBarCompat { | |
private static final int COLOR_TRANSLUCENT = Color.parseColor("#00000000"); | |
public static final int DEFAULT_COLOR_ALPHA = 112; | |
/** | |
* set statusBarColor | |
* @param statusColor color | |
* @param alpha 0 - 255 | |
*/ | |
public static void setStatusBarColor(Activity activity, int statusColor, int alpha) { | |
setStatusBarColor(activity, calculateStatusBarColor(statusColor, alpha)); | |
} | |
public static void setStatusBarColor(Activity activity, int statusColor) { | |
Window window = activity.getWindow(); | |
ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT); | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { | |
//First translucent status bar. | |
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | |
//After LOLLIPOP not translucent status bar | |
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
//Then call setStatusBarColor. | |
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); | |
window.setStatusBarColor(statusColor); | |
//set child View not fill the system window | |
View mChildView = mContentView.getChildAt(0); | |
if (mChildView != null) { | |
ViewCompat.setFitsSystemWindows(mChildView, true); | |
} | |
} else { | |
ViewGroup mDecorView = (ViewGroup) window.getDecorView(); | |
if (mDecorView.getTag() != null && mDecorView.getTag() instanceof Boolean && (Boolean)mDecorView.getTag()) { | |
//if has add fake status bar view | |
View mStatusBarView = mDecorView.getChildAt(0); | |
if (mStatusBarView != null) { | |
mStatusBarView.setBackgroundColor(statusColor); | |
} | |
} else { | |
int statusBarHeight = getStatusBarHeight(activity); | |
//add margin | |
View mContentChild = mContentView.getChildAt(0); | |
if (mContentChild != null) { | |
ViewCompat.setFitsSystemWindows(mContentChild, false); | |
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mContentChild.getLayoutParams(); | |
lp.topMargin += statusBarHeight; | |
mContentChild.setLayoutParams(lp); | |
} | |
//add fake status bar view | |
View mStatusBarView = new View(activity); | |
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight); | |
layoutParams.gravity = Gravity.TOP; | |
mStatusBarView.setLayoutParams(layoutParams); | |
mStatusBarView.setBackgroundColor(statusColor); | |
mDecorView.addView(mStatusBarView, 0); | |
mDecorView.setTag(true); | |
} | |
} | |
} | |
} | |
public static void translucentStatusBar(Activity activity) { | |
translucentStatusBar(activity, false); | |
} | |
/** | |
* change to full screen mode | |
* @param hideStatusBarBackground hide status bar alpha Background when SDK > 21, true if hide it | |
*/ | |
public static void translucentStatusBar(Activity activity, boolean hideStatusBarBackground) { | |
Window window = activity.getWindow(); | |
ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT); | |
//set child View not fill the system window | |
View mChildView = mContentView.getChildAt(0); | |
if (mChildView != null) { | |
ViewCompat.setFitsSystemWindows(mChildView, false); | |
} | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { | |
int statusBarHeight = getStatusBarHeight(activity); | |
//First translucent status bar. | |
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | |
//After LOLLIPOP just set LayoutParams. | |
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); | |
if (hideStatusBarBackground) { | |
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
window.setStatusBarColor(COLOR_TRANSLUCENT); | |
} else { | |
window.setStatusBarColor(calculateStatusBarColor(COLOR_TRANSLUCENT, DEFAULT_COLOR_ALPHA)); | |
} | |
//must call requestApplyInsets, otherwise it will have space in screen bottom | |
if (mChildView != null) { | |
ViewCompat.requestApplyInsets(mChildView); | |
} | |
} else { | |
ViewGroup mDecorView = (ViewGroup) window.getDecorView(); | |
if (mDecorView.getTag() != null && mDecorView.getTag() instanceof Boolean && (Boolean)mDecorView.getTag()) { | |
mChildView = mDecorView.getChildAt(0); | |
//remove fake status bar view. | |
mContentView.removeView(mChildView); | |
mChildView = mContentView.getChildAt(0); | |
if (mChildView != null) { | |
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mChildView.getLayoutParams(); | |
//cancel the margin top | |
if (lp != null && lp.topMargin >= statusBarHeight) { | |
lp.topMargin -= statusBarHeight; | |
mChildView.setLayoutParams(lp); | |
} | |
} | |
mDecorView.setTag(false); | |
} | |
} | |
} | |
} | |
private void fullScreenMode(Activity activity) { | |
Window window = activity.getWindow(); | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | |
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | |
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE); | |
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); | |
window.setStatusBarColor(Color.TRANSPARENT); | |
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { | |
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | |
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | |
| View.SYSTEM_UI_FLAG_IMMERSIVE); | |
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
} | |
} | |
//Get status bar height | |
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().getDimensionPixelOffset(resId); | |
} | |
return result; | |
} | |
//Get alpha color | |
private static int calculateStatusBarColor(int color, int alpha) { | |
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment