import android.annotation.TargetApi; | |
import android.app.Activity; | |
import android.content.Context; | |
import android.graphics.Color; | |
import android.os.Build; | |
import android.support.v4.widget.DrawerLayout; | |
import android.util.AttributeSet; | |
import android.util.TypedValue; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.view.Window; | |
import android.view.WindowManager; | |
import android.widget.LinearLayout; | |
import java.lang.reflect.Method; | |
/** | |
* <pre> | |
* author: Blankj | |
* blog : http://blankj.com | |
* time : 2016/9/23 | |
* desc : 栏相关工具类 | |
* </pre> | |
*/ | |
public class BarUtils { | |
private BarUtils() { | |
throw new UnsupportedOperationException("u can't instantiate me..."); | |
} | |
public static class StatusBarView extendsView { | |
public StatusBarView(Contextcontext, AttributeSet attrs) { | |
super(context, attrs); | |
} | |
public StatusBarView(Contextcontext) { | |
super(context); | |
} | |
} | |
public static final int DEFAULT_STATUS_BAR_ALPHA= 112; | |
/** | |
* 设置状态栏颜色 | |
* | |
* @param activity 需要设置的 activity | |
* @param color 状态栏颜色值 | |
*/ | |
public static void setColor(Activity activity, int color) { | |
setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA); | |
} | |
/** | |
* 设置状态栏颜色 | |
* | |
* @param activity 需要设置的activity | |
* @param color 状态栏颜色值 | |
* @param statusBarAlpha 状态栏透明度 | |
*/ | |
public static void setColor(Activity activity, int color, int statusBarAlpha) { | |
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, statusBarAlpha)); | |
} else if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) { | |
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); | |
int count = decorView.getChildCount(); | |
if (count > 0 && decorView.getChildAt(count- 1) instanceof StatusBarView) { | |
decorView.getChildAt(count- 1).setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); | |
} else { | |
StatusBarView statusView = createStatusBarView(activity, color, statusBarAlpha); | |
decorView.addView(statusView); | |
} | |
setRootView(activity); | |
} | |
} | |
/** | |
* 为滑动返回界面设置状态栏颜色 | |
* | |
* @param activity 需要设置的activity | |
* @param color 状态栏颜色值 | |
*/ | |
public static void setColorForSwipeBack(Activityactivity, int color) { | |
setColorForSwipeBack(activity, color, DEFAULT_STATUS_BAR_ALPHA); | |
} | |
/** | |
* 为滑动返回界面设置状态栏颜色 | |
* | |
* @param activity 需要设置的activity | |
* @param color 状态栏颜色值 | |
* @param statusBarAlpha 状态栏透明度 | |
*/ | |
public static void setColorForSwipeBack(Activityactivity, int color, int statusBarAlpha) { | |
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) { | |
ViewGroup contentView = ((ViewGroup) activity.findViewById(android.R.id.content)); | |
contentView.setPadding(0, getStatusBarHeight(activity),0, 0); | |
contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); | |
setTransparentForWindow(activity); | |
} | |
} | |
/** | |
* 设置状态栏纯色 不加半透明效果 | |
* | |
* @param activity 需要设置的 activity | |
* @param color 状态栏颜色值 | |
*/ | |
public static void setColorNoTranslucent(Activityactivity, int color) { | |
setColor(activity, color, 0); | |
} | |
/** | |
* 设置状态栏颜色(5.0以下无半透明效果,不建议使用) | |
* | |
* @param activity 需要设置的 activity | |
* @param color 状态栏颜色值 | |
*/ | |
@Deprecated | |
public static void setColorDiff(Activityactivity, int color) { | |
if (Build.VERSION.SDK_INT< Build.VERSION_CODES.KITKAT) { | |
return; | |
} | |
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
// 生成一个状态栏大小的矩形 | |
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); | |
int count = decorView.getChildCount(); | |
if (count > 0 && decorView.getChildAt(count- 1) instanceof StatusBarView) { | |
decorView.getChildAt(count- 1).setBackgroundColor(color); | |
} else { | |
StatusBarView statusView = createStatusBarView(activity, color); | |
decorView.addView(statusView); | |
} | |
setRootView(activity); | |
} | |
/** | |
* 使状态栏半透明 | |
* <p> | |
* 适用于图片作为背景的界面,此时需要图片填充到状态栏 | |
* | |
* @param activity 需要设置的activity | |
*/ | |
public static void setTranslucent(Activityactivity) { | |
setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA); | |
} | |
/** | |
* 使状态栏半透明 | |
* <p> | |
* 适用于图片作为背景的界面,此时需要图片填充到状态栏 | |
* | |
* @param activity 需要设置的activity | |
* @param statusBarAlpha 状态栏透明度 | |
*/ | |
public static void setTranslucent(Activityactivity, int statusBarAlpha) { | |
if (Build.VERSION.SDK_INT< Build.VERSION_CODES.KITKAT) { | |
return; | |
} | |
setTransparent(activity); | |
addTranslucentView(activity, statusBarAlpha); | |
} | |
/** | |
* 针对根布局是 CoordinatorLayout, 使状态栏半透明 | |
* <p> | |
* 适用于图片作为背景的界面,此时需要图片填充到状态栏 | |
* | |
* @param activity 需要设置的activity | |
* @param statusBarAlpha 状态栏透明度 | |
*/ | |
public static void setTranslucentForCoordinatorLayout(Activityactivity, int statusBarAlpha) { | |
if (Build.VERSION.SDK_INT< Build.VERSION_CODES.KITKAT) { | |
return; | |
} | |
transparentStatusBar(activity); | |
addTranslucentView(activity, statusBarAlpha); | |
} | |
/** | |
* 设置状态栏全透明 | |
* | |
* @param activity 需要设置的activity | |
*/ | |
public static void setTransparent(Activityactivity) { | |
if (Build.VERSION.SDK_INT< Build.VERSION_CODES.KITKAT) { | |
return; | |
} | |
transparentStatusBar(activity); | |
setRootView(activity); | |
} | |
/** | |
* 使状态栏透明(5.0以上半透明效果,不建议使用) | |
* <p> | |
* 适用于图片作为背景的界面,此时需要图片填充到状态栏 | |
* | |
* @param activity 需要设置的activity | |
*/ | |
@Deprecated | |
public static void setTranslucentDiff(Activityactivity) { | |
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) { | |
// 设置状态栏透明 | |
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
setRootView(activity); | |
} | |
} | |
/** | |
* 为DrawerLayout 布局设置状态栏变色 | |
* | |
* @param activity 需要设置的activity | |
* @param drawerLayout DrawerLayout | |
* @param color 状态栏颜色值 | |
*/ | |
public static void setColorForDrawerLayout(Activityactivity, DrawerLayout drawerLayout,int color) { | |
setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA); | |
} | |
/** | |
* 为DrawerLayout 布局设置状态栏颜色,纯色 | |
* | |
* @param activity 需要设置的activity | |
* @param drawerLayout DrawerLayout | |
* @param color 状态栏颜色值 | |
*/ | |
public static void setColorNoTranslucentForDrawerLayout(Activityactivity, DrawerLayout drawerLayout,int color) { | |
setColorForDrawerLayout(activity, drawerLayout, color, 0); | |
} | |
/** | |
* 为DrawerLayout 布局设置状态栏变色 | |
* | |
* @param activity 需要设置的activity | |
* @param drawerLayout DrawerLayout | |
* @param color 状态栏颜色值 | |
* @param statusBarAlpha 状态栏透明度 | |
*/ | |
public static void setColorForDrawerLayout(Activityactivity, DrawerLayout drawerLayout,int color, | |
int statusBarAlpha) { | |
if (Build.VERSION.SDK_INT< Build.VERSION_CODES.KITKAT) { | |
return; | |
} | |
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(Color.TRANSPARENT); | |
} else { | |
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
} | |
// 生成一个状态栏大小的矩形 | |
// 添加 statusBarView 到布局中 | |
ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); | |
if (contentLayout.getChildCount()> 0 && contentLayout.getChildAt(0)instanceof StatusBarView) { | |
contentLayout.getChildAt(0).setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); | |
} else { | |
StatusBarView statusBarView= createStatusBarView(activity, color); | |
contentLayout.addView(statusBarView,0); | |
} | |
// 内容布局不是 LinearLayout 时,设置padding top | |
if (!(contentLayoutinstanceof LinearLayout) && contentLayout.getChildAt(1)!= null) { | |
contentLayout.getChildAt(1) | |
.setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity)+ contentLayout.getPaddingTop(), | |
contentLayout.getPaddingRight(), contentLayout.getPaddingBottom()); | |
} | |
// 设置属性 | |
ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1); | |
drawerLayout.setFitsSystemWindows(false); | |
contentLayout.setFitsSystemWindows(false); | |
contentLayout.setClipToPadding(true); | |
drawer.setFitsSystemWindows(false); | |
addTranslucentView(activity, statusBarAlpha); | |
} | |
/** | |
* 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用) | |
* | |
* @param activity 需要设置的activity | |
* @param drawerLayout DrawerLayout | |
* @param color 状态栏颜色值 | |
*/ | |
@Deprecated | |
public static void setColorForDrawerLayoutDiff(Activityactivity, DrawerLayout drawerLayout,int color) { | |
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) { | |
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
// 生成一个状态栏大小的矩形 | |
ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); | |
if (contentLayout.getChildCount()> 0 && contentLayout.getChildAt(0)instanceof StatusBarView) { | |
contentLayout.getChildAt(0).setBackgroundColor(calculateStatusColor(color,DEFAULT_STATUS_BAR_ALPHA)); | |
} else { | |
// 添加 statusBarView 到布局中 | |
StatusBarView statusBarView= createStatusBarView(activity, color); | |
contentLayout.addView(statusBarView,0); | |
} | |
// 内容布局不是 LinearLayout 时,设置padding top | |
if (!(contentLayoutinstanceof LinearLayout) && contentLayout.getChildAt(1)!= null) { | |
contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0,0); | |
} | |
// 设置属性 | |
ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1); | |
drawerLayout.setFitsSystemWindows(false); | |
contentLayout.setFitsSystemWindows(false); | |
contentLayout.setClipToPadding(true); | |
drawer.setFitsSystemWindows(false); | |
} | |
} | |
/** | |
* 为 DrawerLayout 布局设置状态栏透明 | |
* | |
* @param activity 需要设置的activity | |
* @param drawerLayout DrawerLayout | |
*/ | |
public static void setTranslucentForDrawerLayout(Activityactivity, DrawerLayout drawerLayout) { | |
setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA); | |
} | |
/** | |
* 为 DrawerLayout 布局设置状态栏透明 | |
* | |
* @param activity 需要设置的activity | |
* @param drawerLayout DrawerLayout | |
* @param statusBarAlpha 透明度 | |
*/ | |
public static void setTranslucentForDrawerLayout(Activityactivity, DrawerLayout drawerLayout,int statusBarAlpha) { | |
if (Build.VERSION.SDK_INT< Build.VERSION_CODES.KITKAT) { | |
return; | |
} | |
setTransparentForDrawerLayout(activity, drawerLayout); | |
addTranslucentView(activity, statusBarAlpha); | |
} | |
/** | |
* 为 DrawerLayout 布局设置状态栏透明 | |
* | |
* @param activity 需要设置的activity | |
* @param drawerLayout DrawerLayout | |
*/ | |
public static void setTransparentForDrawerLayout(Activityactivity, DrawerLayout drawerLayout) { | |
if (Build.VERSION.SDK_INT< Build.VERSION_CODES.KITKAT) { | |
return; | |
} | |
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(Color.TRANSPARENT); | |
} else { | |
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
} | |
ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); | |
// 内容布局不是 LinearLayout 时,设置padding top | |
if (!(contentLayoutinstanceof LinearLayout) && contentLayout.getChildAt(1)!= null) { | |
contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0,0); | |
} | |
// 设置属性 | |
ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1); | |
drawerLayout.setFitsSystemWindows(false); | |
contentLayout.setFitsSystemWindows(false); | |
contentLayout.setClipToPadding(true); | |
drawer.setFitsSystemWindows(false); | |
} | |
/** | |
* 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用) | |
* | |
* @param activity 需要设置的activity | |
* @param drawerLayout DrawerLayout | |
*/ | |
@Deprecated | |
public static void setTranslucentForDrawerLayoutDiff(Activityactivity, DrawerLayout drawerLayout) { | |
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) { | |
// 设置状态栏透明 | |
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
// 设置内容布局属性 | |
ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); | |
contentLayout.setFitsSystemWindows(true); | |
contentLayout.setClipToPadding(true); | |
// 设置抽屉布局属性 | |
ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1); | |
vg.setFitsSystemWindows(false); | |
// 设置 DrawerLayout 属性 | |
drawerLayout.setFitsSystemWindows(false); | |
} | |
} | |
/** | |
* 为头部是 ImageView 的界面设置状态栏全透明 | |
* | |
* @param activity 需要设置的activity | |
* @param needOffsetView 需要向下偏移的 View | |
*/ | |
public static void setTransparentForImageView(Activityactivity, View needOffsetView) { | |
setTranslucentForImageView(activity, 0, needOffsetView); | |
} | |
/** | |
* 为头部是 ImageView 的界面设置状态栏透明(使用默认透明度) | |
* | |
* @param activity 需要设置的activity | |
* @param needOffsetView 需要向下偏移的 View | |
*/ | |
public static void setTranslucentForImageView(Activityactivity, View needOffsetView) { | |
setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView); | |
} | |
/** | |
* 为头部是 ImageView 的界面设置状态栏透明 | |
* | |
* @param activity 需要设置的activity | |
* @param statusBarAlpha 状态栏透明度 | |
* @param needOffsetView 需要向下偏移的 View | |
*/ | |
public static void setTranslucentForImageView(Activityactivity, int statusBarAlpha,View needOffsetView) { | |
if (Build.VERSION.SDK_INT< Build.VERSION_CODES.KITKAT) { | |
return; | |
} | |
setTransparentForWindow(activity); | |
addTranslucentView(activity, statusBarAlpha); | |
if (needOffsetView != null) { | |
ViewGroup.MarginLayoutParams layoutParams= (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams(); | |
layoutParams.setMargins(0, getStatusBarHeight(activity),0, 0); | |
} | |
} | |
/** | |
* 为 fragment 头部是 ImageView 的设置状态栏透明 | |
* | |
* @param activity fragment 对应的 activity | |
* @param needOffsetView 需要向下偏移的 View | |
*/ | |
public static void setTranslucentForImageViewInFragment(Activityactivity, View needOffsetView) { | |
setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView); | |
} | |
/** | |
* 为 fragment 头部是 ImageView 的设置状态栏透明 | |
* | |
* @param activity fragment 对应的 activity | |
* @param needOffsetView 需要向下偏移的 View | |
*/ | |
public static void setTransparentForImageViewInFragment(Activityactivity, View needOffsetView) { | |
setTranslucentForImageViewInFragment(activity, 0, needOffsetView); | |
} | |
/** | |
* 为 fragment 头部是 ImageView 的设置状态栏透明 | |
* | |
* @param activity fragment 对应的 activity | |
* @param statusBarAlpha 状态栏透明度 | |
* @param needOffsetView 需要向下偏移的 View | |
*/ | |
public static void setTranslucentForImageViewInFragment(Activityactivity, int statusBarAlpha,View needOffsetView) { | |
setTranslucentForImageView(activity, statusBarAlpha, needOffsetView); | |
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT&& Build.VERSION.SDK_INT< Build.VERSION_CODES.LOLLIPOP) { | |
clearPreviousSetting(activity); | |
} | |
} | |
/// | |
@TargetApi(Build.VERSION_CODES.KITKAT) | |
private static void clearPreviousSetting(Activityactivity) { | |
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); | |
int count = decorView.getChildCount(); | |
if (count > 0 && decorView.getChildAt(count- 1) instanceof StatusBarView) { | |
decorView.removeViewAt(count- 1); | |
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); | |
rootView.setPadding(0,0, 0, 0); | |
} | |
} | |
/** | |
* 添加半透明矩形条 | |
* | |
* @param activity 需要设置的 activity | |
* @param statusBarAlpha 透明值 | |
*/ | |
private static void addTranslucentView(Activityactivity, int statusBarAlpha) { | |
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content); | |
if (contentView.getChildCount()> 1) { | |
contentView.getChildAt(1).setBackgroundColor(Color.argb(statusBarAlpha,0, 0, 0)); | |
} else { | |
contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha)); | |
} | |
} | |
/** | |
* 生成一个和状态栏大小相同的彩色矩形条 | |
* | |
* @param activity 需要设置的 activity | |
* @param color 状态栏颜色值 | |
* @return 状态栏矩形条 | |
*/ | |
private static StatusBarViewcreateStatusBarView(Activityactivity, int color) { | |
// 绘制一个和状态栏一样高的矩形 | |
StatusBarView statusBarView= new StatusBarView(activity); | |
LinearLayout.LayoutParams params= | |
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); | |
statusBarView.setLayoutParams(params); | |
statusBarView.setBackgroundColor(color); | |
return statusBarView; | |
} | |
/** | |
* 生成一个和状态栏大小相同的半透明矩形条 | |
* | |
* @param activity 需要设置的activity | |
* @param color 状态栏颜色值 | |
* @param alpha 透明值 | |
* @return 状态栏矩形条 | |
*/ | |
private static StatusBarViewcreateStatusBarView(Activityactivity, int color, int alpha) { | |
// 绘制一个和状态栏一样高的矩形 | |
StatusBarView statusBarView= new StatusBarView(activity); | |
LinearLayout.LayoutParams params= | |
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); | |
statusBarView.setLayoutParams(params); | |
statusBarView.setBackgroundColor(calculateStatusColor(color, alpha)); | |
return statusBarView; | |
} | |
/** | |
* 设置根布局参数 | |
*/ | |
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) | |
private static void setRootView(Activityactivity) { | |
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); | |
rootView.setFitsSystemWindows(true); | |
rootView.setClipToPadding(true); | |
} | |
/** | |
* 设置透明 | |
*/ | |
private static void setTransparentForWindow(Activityactivity) { | |
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); | |
} | |
} | |
/** | |
* 使状态栏透明 | |
*/ | |
@TargetApi(Build.VERSION_CODES.KITKAT) | |
private static void transparentStatusBar(Activityactivity) { | |
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); | |
} | |
} | |
/** | |
* 创建半透明矩形 View | |
* | |
* @param alpha 透明值 | |
* @return 半透明 View | |
*/ | |
private static StatusBarViewcreateTranslucentStatusBarView(Activityactivity, int alpha) { | |
// 绘制一个和状态栏一样高的矩形 | |
StatusBarView statusBarView= new StatusBarView(activity); | |
LinearLayout.LayoutParams params= | |
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); | |
statusBarView.setLayoutParams(params); | |
statusBarView.setBackgroundColor(Color.argb(alpha,0, 0, 0)); | |
return statusBarView; | |
} | |
/** | |
* 获取状态栏高度 | |
* | |
* @param context context | |
* @return 状态栏高度 | |
*/ | |
public static int getStatusBarHeight(Contextcontext) { | |
int result = -1; | |
int resourceId = context.getResources().getIdentifier("status_bar_height","dimen","android"); | |
if (resourceId > 0) { | |
result = context.getResources().getDimensionPixelSize(resourceId); | |
} | |
return result; | |
} | |
/** | |
* 计算状态栏颜色 | |
* | |
* @param color color值 | |
* @param alpha alpha值 | |
* @return 最终的状态栏颜色 | |
*/ | |
private static int calculateStatusColor(intcolor, 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; | |
} | |
/*--------------------------------old--------------------------------*/ | |
/** | |
* 设置透明状态栏(api大于19方可使用) | |
* <p>可在Activity的onCreat()中调用</p> | |
* <p>需在顶部控件布局中加入以下属性让内容出现在状态栏之下</p> | |
* <p>android:clipToPadding="true"</p> | |
* <p>android:fitsSystemWindows="true"</p> | |
* | |
* @param activity activity | |
*/ | |
public static void setTransparentStatusBar(Activityactivity) { | |
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) { | |
//透明状态栏 | |
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); | |
//透明导航栏 | |
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); | |
} | |
} | |
/** | |
* 隐藏状态栏 | |
* <p>也就是设置全屏,一定要在setContentView之前调用,否则报错</p> | |
* <p>此方法Activity可以继承AppCompatActivity</p> | |
* <p>启动的时候状态栏会显示一下再隐藏,比如QQ的欢迎界面</p> | |
* <p>在配置文件中Activity加属性android:theme="@android:style/Theme.NoTitleBar.Fullscreen"</p> | |
* <p>如加了以上配置Activity不能继承AppCompatActivity,会报错</p> | |
* | |
* @param activity activity | |
*/ | |
public static void hideStatusBar(Activityactivity) { | |
activity.requestWindowFeature(Window.FEATURE_NO_TITLE); | |
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, | |
WindowManager.LayoutParams.FLAG_FULLSCREEN); | |
} | |
/** | |
* 判断状态栏是否存在 | |
* | |
* @param activity activity | |
* @return {@code true}: 存在<br>{@code false}: 不存在 | |
*/ | |
public static boolean isStatusBarExists(Activityactivity) { | |
WindowManager.LayoutParams params= activity.getWindow().getAttributes(); | |
return (params.flags& WindowManager.LayoutParams.FLAG_FULLSCREEN)!= WindowManager.LayoutParams.FLAG_FULLSCREEN; | |
} | |
/** | |
* 获取ActionBar高度 | |
* | |
* @param activity activity | |
* @return ActionBar高度 | |
*/ | |
public static int getActionBarHeight(Activityactivity) { | |
TypedValue tv = new TypedValue(); | |
if (activity.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { | |
return TypedValue.complexToDimensionPixelSize(tv.data, activity.getResources().getDisplayMetrics()); | |
} | |
return 0; | |
} | |
/** | |
* 显示通知栏 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>}</p> | |
* | |
* @param context 上下文 | |
* @param isSettingPanel {@code true}: 打开设置<br>{@code false}: 打开通知 | |
*/ | |
public static void showNotificationBar(Contextcontext, boolean isSettingPanel) { | |
String methodName = (Build.VERSION.SDK_INT<= 16) ? "expand" | |
: (isSettingPanel ? "expandSettingsPanel": "expandNotificationsPanel"); | |
invokePanels(context, methodName); | |
} | |
/** | |
* 隐藏通知栏 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>}</p> | |
* | |
* @param context 上下文 | |
*/ | |
public static void hideNotificationBar(Contextcontext) { | |
String methodName = (Build.VERSION.SDK_INT<= 16) ? "collapse": "collapsePanels"; | |
invokePanels(context, methodName); | |
} | |
/** | |
* 反射唤醒通知栏 | |
* | |
* @param context 上下文 | |
* @param methodName 方法名 | |
*/ | |
private static void invokePanels(Contextcontext, String methodName) { | |
try { | |
Object service = context.getSystemService("statusbar"); | |
Class<?> statusBarManager = Class.forName("android.app.StatusBarManager"); | |
Method expand = statusBarManager.getMethod(methodName); | |
expand.invoke(service); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
} |
栏相关→BarUtils
最新推荐文章于 2024-04-23 09:43:12 发布