透明状态栏的实现

来源:互联网 发布:如何设置淘宝客推广 编辑:程序博客网 时间:2024/05/22 14:20

透明状态栏的实现

这里需要适配android4.0和android5.0的效果。
效果图如下:

1.定义样式
在style.xml
<style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar">    <item name="colorPrimary">@color/colorPrimary</item>    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>    <item name="colorAccent">@color/colorAccent</item>    <item name="android:divider">@drawable/ic_list_divider</item>    <item name="android:dividerHeight">@dimen/division_line</item>    <item name="android:listDivider">@drawable/ic_list_divider</item>    <item name="android:homeAsUpIndicator">@drawable/ic_arrow_back_white_24dp</item></style><style name="AppTheme" parent="AppThemeBase">
<style name="AppTheme.Toolbar" parent="Widget.AppCompat.ActionBar">    <item name="android:layout_width">match_parent</item>    <item name="android:layout_height">?attr/actionBarSize</item>    <item name="android:background">?attr/colorPrimary</item>    <item name="android:theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item></style>

在style-v19.xml
<!-- Base application theme. --><style name="AppTheme" parent="AppThemeBase"></style><style name="AppTheme.TranslucentStatus">    <item name="android:windowTranslucentStatus">true</item></style>
在style-v21.xml
<!-- Base application theme. --><style name="AppTheme" parent="AppThemeBase"></style><style name="AppTheme.TranslucentStatus">    <item name="android:windowTranslucentStatus">true</item>    <item name="android:statusBarColor">@android:color/transparent</item></style><style name="AppTheme.Toolbar" parent="Widget.AppCompat.ActionBar">    <item name="android:layout_width">match_parent</item>    <item name="android:layout_height">?attr/actionBarSize</item>    <item name="android:background">?attr/colorPrimary</item>    <item name="android:theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>    <item name="android:elevation">2dp</item></style>
2.设置状态栏的工具类
public class StatusBarUtil {    public static int DEFAULT_COLOR = 0;    public static float DEFAULT_ALPHA = 0;//Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 0.2f : 0.3f;    public static final int MIN_API = 19;    //<editor-fold desc="沉侵">    public static void immersive(Activity activity) {        immersive(activity, DEFAULT_COLOR, DEFAULT_ALPHA);    }    public static void immersive(Activity activity, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {        immersive(activity.getWindow(), color, alpha);    }    public static void immersive(Activity activity, int color) {        immersive(activity.getWindow(), color, 1f);    }    public static void immersive(Window window) {        immersive(window, DEFAULT_COLOR, DEFAULT_ALPHA);    }    public static void immersive(Window window, int color) {        immersive(window, color, 1f);    }    public static void immersive(Window window, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {        if (Build.VERSION.SDK_INT >= 21) {            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            window.setStatusBarColor(mixtureColor(color, alpha));            int systemUiVisibility = window.getDecorView().getSystemUiVisibility();            systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;            systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;            window.getDecorView().setSystemUiVisibility(systemUiVisibility);        } else if (Build.VERSION.SDK_INT >= 19) {            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            setTranslucentView((ViewGroup) window.getDecorView(), color, alpha);        } else if (Build.VERSION.SDK_INT >= MIN_API && Build.VERSION.SDK_INT > 16) {            int systemUiVisibility = window.getDecorView().getSystemUiVisibility();            systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;            systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;            window.getDecorView().setSystemUiVisibility(systemUiVisibility);        }    }    //</editor-fold>    //<editor-fold desc="DarkMode">    public static void darkMode(Activity activity, boolean dark) {        if (isFlyme4Later()) {            darkModeForFlyme4(activity.getWindow(), dark);        } else if (isMIUI6Later()) {            darkModeForMIUI6(activity.getWindow(), dark);        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            darkModeForM(activity.getWindow(), dark);        }    }    /** 设置状态栏darkMode,字体颜色及icon变黑(目前支持MIUI6以上,Flyme4以上,Android M以上) */    public static void darkMode(Activity activity) {        darkMode(activity.getWindow(), DEFAULT_COLOR, DEFAULT_ALPHA);    }    public static void darkMode(Activity activity, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {        darkMode(activity.getWindow(), color, alpha);    }    /** 设置状态栏darkMode,字体颜色及icon变黑(目前支持MIUI6以上,Flyme4以上,Android M以上) */    public static void darkMode(Window window, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {        if (isFlyme4Later()) {            darkModeForFlyme4(window, true);            immersive(window,color,alpha);        } else if (isMIUI6Later()) {            darkModeForMIUI6(window, true);            immersive(window,color,alpha);        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            darkModeForM(window, true);            immersive(window, color, alpha);        } else if (Build.VERSION.SDK_INT >= 19) {            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            setTranslucentView((ViewGroup) window.getDecorView(), color, alpha);        } else {            immersive(window, color, alpha);        }//        if (Build.VERSION.SDK_INT >= 21) {//            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//            window.setStatusBarColor(Color.TRANSPARENT);//        } else if (Build.VERSION.SDK_INT >= 19) {//            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//        }//        setTranslucentView((ViewGroup) window.getDecorView(), color, alpha);    }    //------------------------->    /** android 6.0设置字体颜色 */    @RequiresApi(Build.VERSION_CODES.M)    private static void darkModeForM(Window window, boolean dark) {//        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//        window.setStatusBarColor(Color.TRANSPARENT);        int systemUiVisibility = window.getDecorView().getSystemUiVisibility();        if (dark) {            systemUiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;        } else {            systemUiVisibility &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;        }        window.getDecorView().setSystemUiVisibility(systemUiVisibility);    }    /**     * 设置Flyme4+darkMode,darkMode时候字体颜色及icon变黑     * http://open-wiki.flyme.cn/index.php?title=Flyme%E7%B3%BB%E7%BB%9FAPI     */    public static boolean darkModeForFlyme4(Window window, boolean dark) {        boolean result = false;        if (window != null) {            try {                WindowManager.LayoutParams e = window.getAttributes();                Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");                Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");                darkFlag.setAccessible(true);                meizuFlags.setAccessible(true);                int bit = darkFlag.getInt(null);                int value = meizuFlags.getInt(e);                if (dark) {                    value |= bit;                } else {                    value &= ~bit;                }                meizuFlags.setInt(e, value);                window.setAttributes(e);                result = true;            } catch (Exception var8) {                Log.e("StatusBar", "darkIcon: failed");            }        }        return result;    }    /**     * 设置MIUI6+的状态栏是否为darkMode,darkMode时候字体颜色及icon变黑     * http://dev.xiaomi.com/doc/p=4769/     */    public static boolean darkModeForMIUI6(Window window, boolean darkmode) {        Class<? extends Window> clazz = window.getClass();        try {            int darkModeFlag = 0;            Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");            darkModeFlag = field.getInt(layoutParams);            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);            extraFlagField.invoke(window, darkmode ? darkModeFlag : 0, darkModeFlag);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /** 判断是否Flyme4以上 */    public static boolean isFlyme4Later() {        return Build.FINGERPRINT.contains("Flyme_OS_4")                || Build.VERSION.INCREMENTAL.contains("Flyme_OS_4")                || Pattern.compile("Flyme OS [4|5]", Pattern.CASE_INSENSITIVE).matcher(Build.DISPLAY).find();    }    /** 判断是否为MIUI6以上 */    public static boolean isMIUI6Later() {        try {            Class<?> clz = Class.forName("android.os.SystemProperties");            Method mtd = clz.getMethod("get", String.class);            String val = (String) mtd.invoke(null, "ro.miui.ui.version.name");            val = val.replaceAll("[vV]", "");            int version = Integer.parseInt(val);            return version >= 6;        } catch (Exception e) {            return false;        }    }    //</editor-fold>    /** 增加ViewpaddingTop,增加的值为状态栏高度 */    public static void setPadding(Context context, View view) {        if (Build.VERSION.SDK_INT >= MIN_API) {            view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),                    view.getPaddingRight(), view.getPaddingBottom());        }    }    /** 增加ViewpaddingTop,增加的值为状态栏高度 (智能判断,并设置高度)*/    public static void setPaddingSmart(Context context, View view) {        if (Build.VERSION.SDK_INT >= MIN_API) {            ViewGroup.LayoutParams lp = view.getLayoutParams();            if (lp != null && lp.height > 0) {                lp.height += getStatusBarHeight(context);//增高            }            view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),                    view.getPaddingRight(), view.getPaddingBottom());        }    }    /** 增加View的高度以及paddingTop,增加的值为状态栏高度.一般是在沉浸式全屏给ToolBar用的 */    public static void setHeightAndPadding(Context context, View view) {        if (Build.VERSION.SDK_INT >= MIN_API) {            ViewGroup.LayoutParams lp = view.getLayoutParams();            lp.height += getStatusBarHeight(context);//增高            view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),                    view.getPaddingRight(), view.getPaddingBottom());        }    }    /** 增加View上边距(MarginTop)一般是给高度为 WARP_CONTENT 的小控件用的*/    public static void setMargin(Context context, View view) {        if (Build.VERSION.SDK_INT >= MIN_API) {            ViewGroup.LayoutParams lp = view.getLayoutParams();            if (lp instanceof ViewGroup.MarginLayoutParams) {                ((ViewGroup.MarginLayoutParams) lp).topMargin += getStatusBarHeight(context);//增高            }            view.setLayoutParams(lp);        }    }    /**     * 创建假的透明栏     */    public static void setTranslucentView(ViewGroup container, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {        if (Build.VERSION.SDK_INT >= 19) {            int mixtureColor = mixtureColor(color, alpha);            View translucentView = container.findViewById(android.R.id.custom);            if (translucentView == null && mixtureColor != 0) {                translucentView = new View(container.getContext());                translucentView.setId(android.R.id.custom);                ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(                        ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(container.getContext()));                container.addView(translucentView, lp);            }            if (translucentView != null) {                translucentView.setBackgroundColor(mixtureColor);            }        }    }    public static int mixtureColor(int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {        int a = (color & 0xff000000) == 0 ? 0xff : color >>> 24;        return (color & 0x00ffffff) | (((int) (a * alpha)) << 24);    }    /** 获取状态栏高度 */    public static int getStatusBarHeight(Context context) {        int result = 24;        int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");        if (resId > 0) {            result = context.getResources().getDimensionPixelSize(resId);        } else {            result = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,                    result, Resources.getSystem().getDisplayMetrics());        }        return result;    }}
4.布局文件代码
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="supplier.ztxx.com.test.MainActivity">      <android.support.v7.widget.Toolbar style="@style/AppTheme.Toolbar"        android:id="@+id/toolbar"        app:title="标题栏"/>    <com.scwang.smartrefresh.layout.SmartRefreshLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/refreshLayout"        >        <android.support.v7.widget.RecyclerView            android:id="@+id/recyclerView"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:overScrollMode="never"            android:background="#fff"            />    </com.scwang.smartrefresh.layout.SmartRefreshLayout>    </LinearLayout>

5.在需要的activity中进行设置
StatusBarUtil.setPaddingSmart(this,findViewById(R.id.toolbar));//设置toolbar的样式StatusBarUtil.immersive(this, 0xff000000, 0.1f);//设置状态栏的参数


原创粉丝点击