Android通知栏颜色改变方法

来源:互联网 发布:正能量的句子 知乎 编辑:程序博客网 时间:2024/04/29 06:40

1、android 沉浸式状态栏

通知栏(notification)背景颜色跟随app导航栏(top title)背景颜色变化而变化。这也叫沉浸式状态栏,这是Google在android 4.4以上的系统提出的。

Activity中添加如下代码:

[java] view plaincopy
  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {    
  2.     getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);    
  3.     getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);    
  4. }   
布局文件中的导航条添加如下属性:

[html] view plaincopy
  1. android:clipToPadding="false"    
  2. android:fitsSystemWindows="true"   

更多内容请参考:http://blog.csdn.net/carlos1992/article/details/46773059

2、改变通知栏颜色

当时要的就是这个,而搜到的很多都是沉浸效果。沉浸效果相当于隐藏了通知栏,对整个屏幕进行了拉伸,这时不仅自己的导航栏要考虑通知栏的高度,还要考虑4.4以下的Android系统无法沉浸通知栏的情况。另外,对于有虚拟按键Android设备的底部也会被沉浸,这并不是我们想要的。
下面是我整理的代码:

[java] view plaincopy
  1. public class Utility {  
  2.     /**  
  3.      * 改变通知栏颜色 
  4.      */  
  5.     public static void setActionBar(Context context){  
  6.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  7.             setTranslucentStatus(context, true);  
  8.         }  
  9.         SystemBarTintManager tintManager = new SystemBarTintManager((Activity) context);  
  10.         tintManager.setStatusBarTintEnabled(true);  
  11.         tintManager.setStatusBarTintResource(R.color.action_bar);  
  12.     }  
  13.       
  14.     @TargetApi(19)   
  15.     public static void setTranslucentStatus(Context context, boolean on) {  
  16.         Window win = ((Activity)context).getWindow();  
  17.         WindowManager.LayoutParams winParams = win.getAttributes();  
  18.         final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;  
  19.         if (on) {  
  20.             winParams.flags |= bits;  
  21.         } else {  
  22.             winParams.flags &= ~bits;  
  23.         }  
  24.         win.setAttributes(winParams);  
  25.     }  
  26. }  

在Activity的onCreate中调用上面方法

[java] view plaincopy
  1. Utility.setActionBar(this);  
同时在xml布局最外层添加下面的属性
[html] view plaincopy
  1. android:fitsSystemWindows="true"  
SystemBarTintManager.java代码:
[java] view plaincopy
  1. package com.yuebao.shop.util;  
  2.   
  3. import android.annotation.SuppressLint;  
  4. import android.annotation.TargetApi;  
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.content.res.Configuration;  
  8. import android.content.res.Resources;  
  9. import android.content.res.TypedArray;  
  10. import android.graphics.drawable.Drawable;  
  11. import android.os.Build;  
  12. import android.util.DisplayMetrics;  
  13. import android.util.TypedValue;  
  14. import android.view.Gravity;  
  15. import android.view.View;  
  16. import android.view.ViewConfiguration;  
  17. import android.view.ViewGroup;  
  18. import android.view.Window;  
  19. import android.view.WindowManager;  
  20. import android.widget.FrameLayout.LayoutParams;  
  21.   
  22. import java.lang.reflect.Method;  
  23.   
  24. @SuppressWarnings({ "rawtypes""unchecked" })  
  25. public class SystemBarTintManager {  
  26.   
  27.     static {  
  28.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  29.             try {  
  30.                 Class c = Class.forName("android.os.SystemProperties");  
  31.                 Method m = c.getDeclaredMethod("get", String.class);  
  32.                 m.setAccessible(true);  
  33.                 sNavBarOverride = (String) m.invoke(null"qemu.hw.mainkeys");  
  34.             } catch (Throwable e) {  
  35.                 sNavBarOverride = null;  
  36.             }  
  37.         }  
  38.     }  
  39.   
  40.     public static final int DEFAULT_TINT_COLOR = 0x99000000;  
  41.     private static String sNavBarOverride;  
  42.     private final SystemBarConfig mConfig;  
  43.     private boolean mStatusBarAvailable;  
  44.     private boolean mNavBarAvailable;  
  45.     private boolean mStatusBarTintEnabled;  
  46.     private boolean mNavBarTintEnabled;  
  47.     private View mStatusBarTintView;  
  48.     private View mNavBarTintView;  
  49.   
  50.     @TargetApi(19)  
  51.     public SystemBarTintManager(Activity activity) {  
  52.   
  53.         Window win = activity.getWindow();  
  54.         ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();  
  55.   
  56.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  57.             int[] attrs = {android.R.attr.windowTranslucentStatus,  
  58.                     android.R.attr.windowTranslucentNavigation};  
  59.             TypedArray a = activity.obtainStyledAttributes(attrs);  
  60.             try {  
  61.                 mStatusBarAvailable = a.getBoolean(0false);  
  62.                 mNavBarAvailable = a.getBoolean(1false);  
  63.             } finally {  
  64.                 a.recycle();  
  65.             }  
  66.   
  67.             WindowManager.LayoutParams winParams = win.getAttributes();  
  68.             int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;  
  69.             if ((winParams.flags & bits) != 0) {  
  70.                 mStatusBarAvailable = true;  
  71.             }  
  72.             bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;  
  73.             if ((winParams.flags & bits) != 0) {  
  74.                 mNavBarAvailable = true;  
  75.             }  
  76.         }  
  77.   
  78.         mConfig = new SystemBarConfig(activity, mStatusBarAvailable, mNavBarAvailable);  
  79.         if (!mConfig.hasNavigtionBar()) {  
  80.             mNavBarAvailable = false;  
  81.         }  
  82.   
  83.         if (mStatusBarAvailable) {  
  84.             setupStatusBarView(activity, decorViewGroup);  
  85.         }  
  86.         if (mNavBarAvailable) {  
  87.             setupNavBarView(activity, decorViewGroup);  
  88.         }  
  89.   
  90.     }  
  91.   
  92.     public void setStatusBarTintEnabled(boolean enabled) {  
  93.         mStatusBarTintEnabled = enabled;  
  94.         if (mStatusBarAvailable) {  
  95.             mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);  
  96.         }  
  97.     }  
  98.   
  99.     public void setNavigationBarTintEnabled(boolean enabled) {  
  100.         mNavBarTintEnabled = enabled;  
  101.         if (mNavBarAvailable) {  
  102.             mNavBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);  
  103.         }  
  104.     }  
  105.   
  106.     public void setTintColor(int color) {  
  107.         setStatusBarTintColor(color);  
  108.         setNavigationBarTintColor(color);  
  109.     }  
  110.   
  111.     public void setTintResource(int res) {  
  112.         setStatusBarTintResource(res);  
  113.         setNavigationBarTintResource(res);  
  114.     }  
  115.   
  116.     public void setTintDrawable(Drawable drawable) {  
  117.         setStatusBarTintDrawable(drawable);  
  118.         setNavigationBarTintDrawable(drawable);  
  119.     }  
  120.   
  121.     public void setTintAlpha(float alpha) {  
  122.         setStatusBarAlpha(alpha);  
  123.         setNavigationBarAlpha(alpha);  
  124.     }  
  125.   
  126.     public void setStatusBarTintColor(int color) {  
  127.         if (mStatusBarAvailable) {  
  128.             mStatusBarTintView.setBackgroundColor(color);  
  129.         }  
  130.     }  
  131.   
  132.     public void setStatusBarTintResource(int res) {  
  133.         if (mStatusBarAvailable) {  
  134.             mStatusBarTintView.setBackgroundResource(res);  
  135.         }  
  136.     }  
  137.   
  138.     @SuppressWarnings("deprecation")  
  139.     public void setStatusBarTintDrawable(Drawable drawable) {  
  140.         if (mStatusBarAvailable) {  
  141.             mStatusBarTintView.setBackgroundDrawable(drawable);  
  142.         }  
  143.     }  
  144.   
  145.     @TargetApi(11)  
  146.     public void setStatusBarAlpha(float alpha) {  
  147.         if (mStatusBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {  
  148.             mStatusBarTintView.setAlpha(alpha);  
  149.         }  
  150.     }  
  151.   
  152.     public void setNavigationBarTintColor(int color) {  
  153.         if (mNavBarAvailable) {  
  154.             mNavBarTintView.setBackgroundColor(color);  
  155.         }  
  156.     }  
  157.   
  158.     public void setNavigationBarTintResource(int res) {  
  159.         if (mNavBarAvailable) {  
  160.             mNavBarTintView.setBackgroundResource(res);  
  161.         }  
  162.     }  
  163.   
  164.     @SuppressWarnings("deprecation")  
  165.     public void setNavigationBarTintDrawable(Drawable drawable) {  
  166.         if (mNavBarAvailable) {  
  167.             mNavBarTintView.setBackgroundDrawable(drawable);  
  168.         }  
  169.     }  
  170.   
  171.     @TargetApi(11)  
  172.     public void setNavigationBarAlpha(float alpha) {  
  173.         if (mNavBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {  
  174.             mNavBarTintView.setAlpha(alpha);  
  175.         }  
  176.     }  
  177.   
  178.     public SystemBarConfig getConfig() {  
  179.         return mConfig;  
  180.     }  
  181.   
  182.     public boolean isStatusBarTintEnabled() {  
  183.         return mStatusBarTintEnabled;  
  184.     }  
  185.   
  186.     public boolean isNavBarTintEnabled() {  
  187.         return mNavBarTintEnabled;  
  188.     }  
  189.   
  190.     private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {  
  191.         mStatusBarTintView = new View(context);  
  192.         LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());  
  193.         params.gravity = Gravity.TOP;  
  194.         if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {  
  195.             params.rightMargin = mConfig.getNavigationBarWidth();  
  196.         }  
  197.         mStatusBarTintView.setLayoutParams(params);  
  198.         mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);  
  199.         mStatusBarTintView.setVisibility(View.GONE);  
  200.         decorViewGroup.addView(mStatusBarTintView);  
  201.     }  
  202.   
  203.     private void setupNavBarView(Context context, ViewGroup decorViewGroup) {  
  204.         mNavBarTintView = new View(context);  
  205.         LayoutParams params;  
  206.         if (mConfig.isNavigationAtBottom()) {  
  207.             params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getNavigationBarHeight());  
  208.             params.gravity = Gravity.BOTTOM;  
  209.         } else {  
  210.             params = new LayoutParams(mConfig.getNavigationBarWidth(), LayoutParams.MATCH_PARENT);  
  211.             params.gravity = Gravity.RIGHT;  
  212.         }  
  213.         mNavBarTintView.setLayoutParams(params);  
  214.         mNavBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);  
  215.         mNavBarTintView.setVisibility(View.GONE);  
  216.         decorViewGroup.addView(mNavBarTintView);  
  217.     }  
  218.   
  219.     public static class SystemBarConfig {  
  220.   
  221.         private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height";  
  222.         private static final String NAV_BAR_HEIGHT_RES_NAME = "navigation_bar_height";  
  223.         private static final String NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME = "navigation_bar_height_landscape";  
  224.         private static final String NAV_BAR_WIDTH_RES_NAME = "navigation_bar_width";  
  225.         private static final String SHOW_NAV_BAR_RES_NAME = "config_showNavigationBar";  
  226.   
  227.         private final boolean mTranslucentStatusBar;  
  228.         private final boolean mTranslucentNavBar;  
  229.         private final int mStatusBarHeight;  
  230.         private final int mActionBarHeight;  
  231.         private final boolean mHasNavigationBar;  
  232.         private final int mNavigationBarHeight;  
  233.         private final int mNavigationBarWidth;  
  234.         private final boolean mInPortrait;  
  235.         private final float mSmallestWidthDp;  
  236.   
  237.         private SystemBarConfig(Activity activity, boolean translucentStatusBar, boolean traslucentNavBar) {  
  238.             Resources res = activity.getResources();  
  239.             mInPortrait = (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);  
  240.             mSmallestWidthDp = getSmallestWidthDp(activity);  
  241.             mStatusBarHeight = getInternalDimensionSize(res, STATUS_BAR_HEIGHT_RES_NAME);  
  242.             mActionBarHeight = getActionBarHeight(activity);  
  243.             mNavigationBarHeight = getNavigationBarHeight(activity);  
  244.             mNavigationBarWidth = getNavigationBarWidth(activity);  
  245.             mHasNavigationBar = (mNavigationBarHeight > 0);  
  246.             mTranslucentStatusBar = translucentStatusBar;  
  247.             mTranslucentNavBar = traslucentNavBar;  
  248.         }  
  249.   
  250.         @TargetApi(14)  
  251.         private int getActionBarHeight(Context context) {  
  252.             int result = 0;  
  253.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {  
  254.                 TypedValue tv = new TypedValue();  
  255.                 context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);  
  256.                 result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());  
  257.             }  
  258.             return result;  
  259.         }  
  260.   
  261.         @TargetApi(14)  
  262.         private int getNavigationBarHeight(Context context) {  
  263.             Resources res = context.getResources();  
  264.             int result = 0;  
  265.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {  
  266.                 if (hasNavBar(context)) {  
  267.                     String key;  
  268.                     if (mInPortrait) {  
  269.                         key = NAV_BAR_HEIGHT_RES_NAME;  
  270.                     } else {  
  271.                         key = NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME;  
  272.                     }  
  273.                     return getInternalDimensionSize(res, key);  
  274.                 }  
  275.             }  
  276.             return result;  
  277.         }  
  278.   
  279.         @TargetApi(14)  
  280.         private int getNavigationBarWidth(Context context) {  
  281.             Resources res = context.getResources();  
  282.             int result = 0;  
  283.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {  
  284.                 if (hasNavBar(context)) {  
  285.                     return getInternalDimensionSize(res, NAV_BAR_WIDTH_RES_NAME);  
  286.                 }  
  287.             }  
  288.             return result;  
  289.         }  
  290.   
  291.         @TargetApi(14)  
  292.         private boolean hasNavBar(Context context) {  
  293.             Resources res = context.getResources();  
  294.             int resourceId = res.getIdentifier(SHOW_NAV_BAR_RES_NAME, "bool""android");  
  295.             if (resourceId != 0) {  
  296.                 boolean hasNav = res.getBoolean(resourceId);  
  297.                 // check override flag (see static block)  
  298.                 if ("1".equals(sNavBarOverride)) {  
  299.                     hasNav = false;  
  300.                 } else if ("0".equals(sNavBarOverride)) {  
  301.                     hasNav = true;  
  302.                 }  
  303.                 return hasNav;  
  304.             } else { // fallback  
  305.                 return !ViewConfiguration.get(context).hasPermanentMenuKey();  
  306.             }  
  307.         }  
  308.   
  309.         private int getInternalDimensionSize(Resources res, String key) {  
  310.             int result = 0;  
  311.             int resourceId = res.getIdentifier(key, "dimen""android");  
  312.             if (resourceId > 0) {  
  313.                 result = res.getDimensionPixelSize(resourceId);  
  314.             }  
  315.             return result;  
  316.         }  
  317.   
  318.         @SuppressLint("NewApi")  
  319.         private float getSmallestWidthDp(Activity activity) {  
  320.             DisplayMetrics metrics = new DisplayMetrics();  
  321.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {  
  322.                 activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);  
  323.             } else {  
  324.                 activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);  
  325.             }  
  326.             float widthDp = metrics.widthPixels / metrics.density;  
  327.             float heightDp = metrics.heightPixels / metrics.density;  
  328.             return Math.min(widthDp, heightDp);  
  329.         }  
  330.   
  331.         public boolean isNavigationAtBottom() {  
  332.             return (mSmallestWidthDp >= 600 || mInPortrait);  
  333.         }  
  334.   
  335.         public int getStatusBarHeight() {  
  336.             return mStatusBarHeight;  
  337.         }  
  338.   
  339.         public int getActionBarHeight() {  
  340.             return mActionBarHeight;  
  341.         }  
  342.   
  343.         public boolean hasNavigtionBar() {  
  344.             return mHasNavigationBar;  
  345.         }  
  346.   
  347.         public int getNavigationBarHeight() {  
  348.             return mNavigationBarHeight;  
  349.         }  
  350.   
  351.         public int getNavigationBarWidth() {  
  352.             return mNavigationBarWidth;  
  353.         }  
  354.   
  355.         public int getPixelInsetTop(boolean withActionBar) {  
  356.             return (mTranslucentStatusBar ? mStatusBarHeight : 0) + (withActionBar ? mActionBarHeight : 0);  
  357.         }  
  358.   
  359.         public int getPixelInsetBottom() {  
  360.             if (mTranslucentNavBar && isNavigationAtBottom()) {  
  361.                 return mNavigationBarHeight;  
  362.             } else {  
  363.                 return 0;  
  364.             }  
  365.         }  
  366.   
  367.         public int getPixelInsetRight() {  
  368.             if (mTranslucentNavBar && !isNavigationAtBottom()) {  
  369.                 return mNavigationBarWidth;  
  370.             } else {  
  371.                 return 0;  
  372.             }  
  373.         }  
  374.   
  375.     }  
  376.   
  377. }  
参考文章:http://blog.csdn.net/jdsjlzx/article/details/41643587

0 0
原创粉丝点击