今天做一个Android项目,其中用到一个小功能,要将状态栏的颜色设置和界面风格一样,动态变化。界面是一个webview,也就是状态栏的颜色要和网页头部颜色保持一样的颜色风格,做完了,在这记录一下。
一、状态栏更换背景色
在Activity的onCreate函数中添加:
// 4.4及以上版本开启
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
setTranslucentStatus(true);
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
//此处可以重新指定状态栏颜色
tintManager.setStatusBarTintColor(Color.parseColor("#00000000"));
}
@TargetApi(19)
private void setTranslucentStatus(boolean on)
{
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if (on)
{
winParams.flags |= bits;
}
else
{
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
这里将状态栏设置成了透明。由于使用了沉侵式状态栏,界面布局是从屏幕最顶端(包括状态栏位置)开始,所以这里需要在界面最顶端写一个和状态栏高度一样的view。然后设置这个view的background颜色(该颜色来自view的指定坐标点的颜色,下面会讲到如何获取),由于状态栏设置的是透明色,所以看起来,状态栏就是view的颜色。
二、设置view的颜色(这里我界面是嵌入了一个webview)
1. 首先设置view的高度和状态栏一样
View webview_top = findViewById(R.id.webview_top);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) webview_top.getLayoutParams();
//获取status_bar_height资源的ID
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
//根据资源ID获取响应的尺寸值
layoutParams.height = getResources().getDimensionPixelSize(resourceId);
}
webview_top.setLayoutParams(layoutParams);
2.获取webview指定坐标颜色并设置给view
Bitmap bitmap = getBitmapFromView(webView);
if (null != bitmap)
{
int pixel = bitmap.getPixel(200, 5);
//获取颜色
int redValue = Color.red(pixel);
int greenValue = Color.green(pixel);
int blueValue = Color.blue(pixel);
Log.i(TAG, "【颜色值】 #" + Integer.toHexString(pixel).toUpperCase(), false);
webview_top.setBackgroundColor(pixel);
bitmap.recycle();
}
/**
* 获取view的bitmap
* @param v
* @return
*/
public static Bitmap getBitmapFromView(View v)
{
Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.RGB_565);
Canvas c = new Canvas(b);
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
// Draw background
Drawable bgDrawable = v.getBackground();
if (bgDrawable != null)
{
bgDrawable.draw(c);
}
else
{
c.drawColor(Color.WHITE);
}
// Draw view to canvas
v.draw(c);
return b;
}