package com.ywwxhz.widget.TranslucentStatus; import android.annotation.TargetApi; import android.app.Activity; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.v4.widget.DrawerLayout; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; import com.ywwxhz.cnbetareader.R; /** * com.ywwxhz.common.app * Created by 远望の无限 on 2014/12/13 23:17. */ public class TranslucentStatusHelper { private Activity mActivity; private View mStatusBarView; private ColorDrawable statusDrawable; private static final boolean mTranslucentAvalible; private boolean mTranslucentEnable = false; private int actionBarSizeAttr = android.R.attr.actionBarSize; private TranslucentProxy translucentProxy = TranslucentProxy.AUTO; static { mTranslucentAvalible = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; } private TranslucentStatusHelper(Activity activity) { this.mActivity = activity; } public static Builder from(Activity activity) { return new Builder(activity); } private void init() { if (mTranslucentAvalible) { initTranslucentStatus(); if (mTranslucentEnable) { initStatusBar(); } } } /** * 设置状态栏颜色 * * @param statusDrawable Drawable */ public void setStatusDrawable(ColorDrawable statusDrawable) { if (isEnable()) { setBackgroundCompat(mStatusBarView, statusDrawable); } } public ColorDrawable getStatusDrawable() { return statusDrawable; } /** * 设置状态栏颜色 * * @param color 颜色的16进制表示 */ public void setStatusColor(int color) { if (isEnable()) { setStatusDrawable(new ColorDrawable(color)); } } /** * 获取是否启用状态栏变色 * * @return */ public boolean isEnable() { return mTranslucentAvalible && mTranslucentEnable; } /** * 设置是否开启状态栏变色 * * @param enable */ public void setEnable(boolean enable) { if (mTranslucentAvalible) { mTranslucentEnable = enable; mStatusBarView.setVisibility(enable ? View.VISIBLE : View.GONE); } } public int getPixelInsetTop(boolean withActionBar) { return isEnable() ? getStatusBarHeight() + (withActionBar ? getActionBarHeight() : 0) : 0; } @TargetApi(19) private void initTranslucentStatus() { switch (translucentProxy) { case KITKAT: // 透明状态栏 mActivity.getWindow() .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); mTranslucentEnable = true; break; case AUTO: Window win = mActivity.getWindow(); // check theme attrs TypedArray a = mActivity.obtainStyledAttributes(new int[]{android.R.attr.windowTranslucentStatus}); try { if (a.getBoolean(0, false)) { mActivity.getWindow() .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); mTranslucentEnable = true; return; } } finally { a.recycle(); } ViewGroup decorViewGroup = (ViewGroup) win.getDecorView(); // check window flags if ((win.getAttributes().flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) != 0) { mTranslucentEnable = true; return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ViewGroup view = (ViewGroup) mActivity.findViewById(android.R.id.content); for (int i=0;i<view.getChildCount();i++){ if(view.getChildAt(i) instanceof DrawerLayout){ if(view.getChildAt(i).getFitsSystemWindows()){ mTranslucentEnable = false; return; } } } mTranslucentEnable = true; win.setStatusBarColor(Color.TRANSPARENT); view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } break; case NONE: mTranslucentEnable = false; break; } } private int getActionBarHeight() { TypedValue tv = new TypedValue(); mActivity.getTheme().resolveAttribute(actionBarSizeAttr, tv, true); return TypedValue.complexToDimensionPixelSize(tv.data, mActivity.getResources().getDisplayMetrics()); } private int getStatusBarHeight() { Resources res = mActivity.getResources(); int result = 0; int resourceId = res.getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = res.getDimensionPixelSize(resourceId); } return result; } private void initStatusBar() { if (mStatusBarView == null) { ViewGroup decorViewGroup = (ViewGroup) mActivity.getWindow().getDecorView(); mStatusBarView = new View(mActivity); FrameLayout.LayoutParams mStatusBarParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT , getStatusBarHeight()); mStatusBarParams.gravity = Gravity.TOP; mStatusBarView.setLayoutParams(mStatusBarParams); decorViewGroup.addView(mStatusBarView); } else { ViewGroup.LayoutParams mStatusBarParams = mStatusBarView.getLayoutParams(); if (mStatusBarParams == null) { throw new IllegalStateException("view must attach to parent view"); } mStatusBarParams.width = ViewGroup.LayoutParams.MATCH_PARENT; mStatusBarParams.height = getStatusBarHeight(); mStatusBarView.setLayoutParams(mStatusBarParams); } setBackgroundCompat(mStatusBarView, statusDrawable); } private void setBackgroundCompat(View v, Drawable drawable) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { v.setBackground(drawable); } else { v.setBackgroundDrawable(drawable); } } public static void TranslucentStatusBar(Activity activity) { // 透明状态栏 activity.getWindow() .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } public enum TranslucentProxy { KITKAT, AUTO, NONE } /** * 用于构造TranslucentStatusHelper */ public static class Builder { private TranslucentStatusHelper helper; private Builder(Activity activity) { helper = new TranslucentStatusHelper(activity); } public TranslucentStatusHelper builder() { if(helper.statusDrawable==null){ TypedArray array = helper.mActivity.obtainStyledAttributes(new int[]{R.attr.colorPrimaryDark}); setStatusColor(array.getColor(0, 0x9F000000)); array.recycle(); } helper.init(); return helper; } public Builder setActionBarSizeAttr(int actionBarSizeAttr) { helper.actionBarSizeAttr = actionBarSizeAttr; return this; } public Builder setStatusColorDrawable(ColorDrawable drawable) { helper.statusDrawable = drawable; return this; } public Builder setStatusColor(int color) { helper.statusDrawable = new ColorDrawable(color); return this; } public Builder setTranslucentProxy(TranslucentProxy translucentProxy) { helper.translucentProxy = translucentProxy; return this; } public Builder setStatusView(View statusView) { helper.mStatusBarView = statusView; return this; } } }