1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 安卓状态栏颜色改变

安卓状态栏颜色改变

时间:2021-12-07 18:36:23

相关推荐

安卓状态栏颜色改变

在安卓App开发中,5.0以上的系统状态栏的颜色改变比较容易,这里主要学习4.4的系统状态栏颜色的改变。

在app欢迎页中 ,我们需要整个页面占据状态栏,接下来实现这个效果:

5.0以上系统,在style文件添加

<item name="windowActionBar">false</item><item name="windowNoTitle">true</item><item name="android:windowTranslucentStatus">false</item><item name="android:windowTranslucentNavigation">true</item><item name="android:statusBarColor">@android:color/transparent</item>

4.4以上系统:

新建values-v19,在style文件中添加

<item name="windowActionBar">false</item><item name="windowNoTitle">true</item><item name="android:windowTranslucentStatus">true</item><item name="android:windowTranslucentNavigation">true</item>

接下来提供一个非常好用的状态栏工具类,主要是针对4.4的,有了这个类 ,以后就可以随意设置状态栏的颜色了。而且还可以改变DrawerLayout状态栏的颜色。

package com.android.core.control;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.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import android.widget.LinearLayout;/*** @author: 蜡笔小新* @date: -05-26 17:41* @GitHub: /meikoz*/public class StatusBarUtil {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);// 生成一个状态栏大小的矩形View statusView = createStatusBarView(activity, color, statusBarAlpha);// 添加 statusView 到布局中ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();decorView.addView(statusView);setRootView(activity);}}/*** 设置状态栏纯色 不加半透明效果** @param activity 需要设置的 activity* @param color 状态栏颜色值*/public static void setColorNoTranslucent(Activity activity, int color) {setColor(activity, color, 0);}/*** 设置状态栏颜色(5.0以下无半透明效果,不建议使用)** @param activity 需要设置的 activity* @param color 状态栏颜色值*/public static void setColorDiff(Activity activity, int color) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {return;}activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);// 生成一个状态栏大小的矩形View statusView = createStatusBarView(activity, color);// 添加 statusView 到布局中ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();decorView.addView(statusView);setRootView(activity);}/*** 使状态栏半透明** 适用于图片作为背景的界面,此时需要图片填充到状态栏** @param activity 需要设置的activity*/public static void setTranslucent(Activity activity) {setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);}public static void setTranslucentBackground(Activity activity) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {Window window = activity.getWindow();window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}}/*** 使状态栏半透明** 适用于图片作为背景的界面,此时需要图片填充到状态栏** @param activity 需要设置的activity* @param statusBarAlpha 状态栏透明度*/public static void setTranslucent(Activity activity, int statusBarAlpha) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {return;}setTransparent(activity);addTranslucentView(activity, statusBarAlpha);}/*** 设置状态栏全透明** @param activity 需要设置的activity*/public static void setTransparent(Activity activity) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {return;}transparentStatusBar(activity);setRootView(activity);}/*** 使状态栏透明(5.0以上半透明效果,不建议使用)** 适用于图片作为背景的界面,此时需要图片填充到状态栏** @param activity 需要设置的activity*/public static void setTranslucentDiff(Activity activity) {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(Activity activity, 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(Activity activity, DrawerLayout drawerLayout, int color) {setColorForDrawerLayout(activity, drawerLayout, color, 0);}/*** 为DrawerLayout 布局设置状态栏变色** @param activity 需要设置的activity* @param drawerLayout DrawerLayout* @param color状态栏颜色值* @param statusBarAlpha 状态栏透明度*/public static void setColorForDrawerLayout(Activity activity, 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);}// 生成一个状态栏大小的矩形View statusBarView = createStatusBarView(activity, color);// 添加 statusBarView 到布局中ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);contentLayout.addView(statusBarView, 0);// 内容布局不是 LinearLayout 时,设置padding topif (!(contentLayout instanceof 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);addTranslucentView(activity, statusBarAlpha);}/*** 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用)** @param activity需要设置的activity* @param drawerLayout DrawerLayout* @param color 状态栏颜色值*/public static void setColorForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout, int color) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);// 生成一个状态栏大小的矩形View statusBarView = createStatusBarView(activity, color);// 添加 statusBarView 到布局中ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);contentLayout.addView(statusBarView, 0);// 内容布局不是 LinearLayout 时,设置padding topif (!(contentLayout instanceof 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(Activity activity, DrawerLayout drawerLayout) {setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA);}/*** 为 DrawerLayout 布局设置状态栏透明** @param activity需要设置的activity* @param drawerLayout DrawerLayout*/public static void setTranslucentForDrawerLayout(Activity activity, 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(Activity activity, 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 topif (!(contentLayout instanceof 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*/public static void setTranslucentForDrawerLayoutDiff(Activity activity, 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);}}/*** 添加半透明矩形条** @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) {contentView.removeViewAt(1);}contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));}/*** 生成一个和状态栏大小相同的彩色矩形条** @param activity 需要设置的 activity* @param color 状态栏颜色值* @return 状态栏矩形条*/private static View createStatusBarView(Activity activity, int color) {// 绘制一个和状态栏一样高的矩形View statusBarView = new View(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 View createStatusBarView(Activity activity, int color, int alpha) {// 绘制一个和状态栏一样高的矩形View statusBarView = new View(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 rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);rootView.setFitsSystemWindows(true);rootView.setClipToPadding(true);}/*** 使状态栏透明*/@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 View createTranslucentStatusBarView(Activity activity, int alpha) {// 绘制一个和状态栏一样高的矩形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));return statusBarView;}/*** 获取状态栏高度** @param context context* @return 状态栏高度*/private static int getStatusBarHeight(Context context) {// 获得状态栏高度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(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;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。