| 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:52:17 发布
提供了一系列用于操作Android状态栏的方法,包括设置状态栏的颜色、透明度等,并针对不同布局提供了特定的功能实现。
4251

被折叠的 条评论
为什么被折叠?



