android 通知栏工具类,关于Android 状态栏的一个操作工具类

## 话不多说直接上代码 ##

import android.annotation.TargetApi;

import android.app.Activity;

import android.content.Context;

import android.graphics.Color;

import android.os.Build;

import android.support.annotation.ColorInt;

import android.view.View;

import android.view.ViewGroup;

import android.view.WindowManager;

import android.widget.LinearLayout;

import com.dtma.grid.base.MainApplication;

import com.dtma.grid.customview.StatusBarView;

/**

* Created by dongchunlin on 2016/11/30.

*/

public class StatusBarUtil {

public static int DEFAULT_STATUS_BAR_ALPHA_TRANSPARENT = 112;

public static int DEFAULT_STATUS_BAR_ALPHA_NOT_TRANSPARENT = 0;

public static int DEFAULT_STATUS_BAR_ALPHA = DEFAULT_STATUS_BAR_ALPHA_NOT_TRANSPARENT;

private static int color1 = 0;

private static int color2 = 0;

private static int color3 = 0;

public static void setDefaultStatusBarNotTransparent() {

DEFAULT_STATUS_BAR_ALPHA = DEFAULT_STATUS_BAR_ALPHA_NOT_TRANSPARENT;

}

public static void setDefaultStatusBarTransparent() {

DEFAULT_STATUS_BAR_ALPHA = DEFAULT_STATUS_BAR_ALPHA_NOT_TRANSPARENT;

}

/**

* 设置状态栏颜色

*

* @param activity 需要设置的 activity

* @param color 状态栏颜色值

*/

public static void setColor(Activity activity, @ColorInt int color) {

setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA);

}

/**

* 设置状态栏颜色

*

* @param activity 需要设置的activity

* @param color 状态栏颜色值

* @param statusBarAlpha 状态栏透明度

*/

public static void setColor(Activity activity, @ColorInt 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 setColorNoTranslucent(Activity activity, @ColorInt int color) {

setColor(activity, color, 0);

}

/**

* 为头部是 ImageView 的界面设置状态栏全透明

*

* @param activity 需要设置的activity

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTransparentForImageView(Activity activity, View needOffsetView) {

setTranslucentForImageView(activity, 0, needOffsetView);

}

/**

* 为头部是 ImageView 的界面设置状态栏透明(使用默认透明度)

*

* @param activity 需要设置的activity

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTranslucentForImageView(Activity activity, View needOffsetView) {

setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);

}

/**

* 为头部是 ImageView 的界面设置状态栏透明

*

* @param activity 需要设置的activity

* @param statusBarAlpha 状态栏透明度

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTranslucentForImageView(Activity activity, 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(Activity activity, View needOffsetView) {

setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);

}

/**

* 为 fragment 头部是 ImageView 的设置状态栏透明

*

* @param activity fragment 对应的 activity

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTransparentForImageViewInFragment(Activity activity, View needOffsetView) {

setTranslucentForImageViewInFragment(activity, 0, needOffsetView);

}

/**

* 为 fragment 头部是 ImageView 的设置状态栏透明

*

* @param activity fragment 对应的 activity

* @param statusBarAlpha 状态栏透明度

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTranslucentForImageViewInFragment(Activity activity, 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(Activity activity) {

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(Activity activity, int statusBarAlpha) {

ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);

if (contentView.getChildCount() > 1) {

// setArgb(color1,);

contentView.getChildAt(1).setBackgroundColor(Color.argb(statusBarAlpha, color1, color2, color3));

} else {

contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));

}

}

public static void setArgb(int c1,int c2,int c3) {

color1 = c1;

color2 = c2;

color3 = c3;

}

/**

* 生成一个和状态栏大小相同的彩色矩形条

*

* @param activity 需要设置的 activity

* @param color 状态栏颜色值

* @return 状态栏矩形条

*/

private static StatusBarView createStatusBarView(Activity activity, @ColorInt 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 StatusBarView createStatusBarView(Activity activity, @ColorInt 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;

}

/**

* 设置根布局参数

*/

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);

}

}

}

/**

* 设置透明

*/

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);

}

}

/**

* 使状态栏透明

*/

@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);

}

}

/**

* 创建半透明矩形 View

*

* @param alpha 透明值

* @return 半透明 View

*/

private static StatusBarView createTranslucentStatusBarView(Activity activity, 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, color1, color2, color3));

return statusBarView;

}

/**

* 获取状态栏高度

*

* @param cntxt context

* @return 状态栏高度

*/

public static int getStatusBarHeight(Context cntxt/*context*/) {

// 获得状态栏高度

Context context = MainApplication.instance().getApplicationContext();

int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");

return context.getResources().getDimensionPixelSize(resourceId);

}

/**

* 计算状态栏颜色

*

* @param color color值

* @param alpha alpha值

* @return 最终的状态栏颜色

*/

private static int calculateStatusColor(@ColorInt 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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值