Android 实现沉浸式(工具类)

  1. 直接调取方法直接使用
    
    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.content.Context;
    import android.content.res.Resources;
    import android.graphics.Color;
    import android.os.Build;
    import android.support.annotation.ColorInt;
    import android.util.DisplayMetrics;
    import android.view.Display;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.FrameLayout;
    
    /**
     *沉浸式状态
     */
    
    public class UltimateBar {
    
        private static final int TYPE_COLOR = 1;
    
        private static final int TYPE_TRANSPARENT = 2;
    
        private static final int TYPE_IMMERSION = 3;
    
        private static final int TYPE_DRAWER = 4;
    
        private static final int TYPE_HIDE = 5;
    
        private Activity activity;
    
        private int type;
    
        public UltimateBar(Activity activity) {
            this.activity = activity;
        }
    
        private ColorBuilder colorBuilder;
    
        private UltimateBar(Activity activity, ColorBuilder builder) {
            this.activity = activity;
            this.type = TYPE_COLOR;
            this.colorBuilder = builder;
        }
    
        private TransparentBuilder transparentBuilder;
    
        private UltimateBar(Activity activity, TransparentBuilder builder) {
            this.activity = activity;
            this.type = TYPE_TRANSPARENT;
            this.transparentBuilder = builder;
        }
    
        private ImmersionBuilder immersionBuilder;
    
        private UltimateBar(Activity activity, ImmersionBuilder builder) {
            this.activity = activity;
            this.type = TYPE_IMMERSION;
            this.immersionBuilder = builder;
        }
    
        private DrawerBuilder drawerBuilder;
    
        private UltimateBar(Activity activity, DrawerBuilder builder) {
            this.activity = activity;
            this.type = TYPE_DRAWER;
            this.drawerBuilder = builder;
        }
    
        private HideBuilder hideBuilder;
    
        private UltimateBar(Activity activity, HideBuilder builder) {
            this.activity = activity;
            this.type = TYPE_HIDE;
            this.hideBuilder = builder;
        }
    
        public static ColorBuilder newColorBuilder() {
            return new ColorBuilder();
        }
    
        public static TransparentBuilder newTransparentBuilder() {
            return new TransparentBuilder();
        }
    
        public static ImmersionBuilder newImmersionBuilder() {
            return new ImmersionBuilder();
        }
    
        public static DrawerBuilder newDrawerBuilder() {
            return new DrawerBuilder();
        }
    
        public static HideBuilder newHideBuilder() {
            return new HideBuilder();
        }
    
        public void apply() {
            if (type == TYPE_COLOR) {
                setColorBar(colorBuilder.statusColor, colorBuilder.statusDepth,
                        colorBuilder.applyNav, colorBuilder.navColor, colorBuilder.navDepth);
            } else if (type == TYPE_TRANSPARENT) {
                setTransparentBar(transparentBuilder.statusColor, transparentBuilder.statusAlpha,
                        transparentBuilder.applyNav, transparentBuilder.navColor, transparentBuilder.navAlpha);
            } else if (type == TYPE_IMMERSION) {
                setTransparentBar(Color.TRANSPARENT, 0, immersionBuilder.applyNav,
                        Color.TRANSPARENT, 0);
            } else if (type == TYPE_DRAWER) {
                setColorBarForDrawer(drawerBuilder.statusColor, drawerBuilder.statusDepth,
                        drawerBuilder.applyNav, drawerBuilder.navColor, drawerBuilder.navDepth);
            } else if (type == TYPE_HIDE) {
                setHideBar(hideBuilder.applyNav);
            }
        }
    
        /**
         * StatusBar and navigationBar color
         * @param statusColor StatusBar color
         * @param statusDepth StatusBar color depth
         * @param navColor NavigationBar color
         * @param navDepth NavigationBar color depth
         */
        @TargetApi(Build.VERSION_CODES.KITKAT)
        public void setColorBar(@ColorInt int statusColor, int statusDepth,
                                @ColorInt int navColor, int navDepth) {
            setColorBar(statusColor, statusDepth, true, navColor, navDepth);
        }
    
    
        @TargetApi(Build.VERSION_CODES.KITKAT)
        public void setColorBar(@ColorInt int statusColor, @ColorInt int navColor) {
            setColorBar(statusColor, 0, navColor, 0);
        }
    
    
        /**
         * StatusBar and NavigationBar hide
         * @param applyNav apply NavigationBar
         */
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private void setHideBar(boolean applyNav) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                View decorView = activity.getWindow().getDecorView();
                int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
                if (applyNav) {
                    option = option | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
                }
                decorView.setSystemUiVisibility(option);
            }
        }
    
    
        /**
         * StatusBar and NavigationBar color
         * @param statusColor StatusBar color
         * @param statusDepth StatusBar color depth
         * @param applyNav apply NavigationBar or no
         * @param navColor NavigationBar color (applyNav == true)
         * @param navDepth NavigationBar color depth (applyNav = true)
         */
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private void setColorBar(@ColorInt int statusColor, int statusDepth, boolean applyNav,
                                 @ColorInt int navColor, int navDepth) {
            int realStatusDepth = limitDepthOrAlpha(statusDepth);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Window window = activity.getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                int finalStatusColor = realStatusDepth == 0 ? statusColor : calculateColor(statusColor, realStatusDepth);
                window.setStatusBarColor(finalStatusColor);
                if (applyNav) {
                    int realNavDepth = limitDepthOrAlpha(navDepth);
                    int finalNavColor = realNavDepth == 0 ? navColor : calculateColor(navColor, realNavDepth);
                    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                    window.setNavigationBarColor(finalNavColor);
                }
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Window window = activity.getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                int finalStatusColor = realStatusDepth == 0 ? statusColor : calculateColor(statusColor, realStatusDepth);
                ViewGroup decorView = (ViewGroup) window.getDecorView();
                decorView.addView(createStatusBarView(activity, finalStatusColor));
                if (applyNav && navigationBarExist(activity)) {
                    int realNavDepth = limitDepthOrAlpha(navDepth);
                    int finalNavColor = realNavDepth == 0 ? navColor : calculateColor(navColor, realNavDepth);
                    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                    decorView.addView(createNavBarView(activity, finalNavColor));
                }
                setRootView(activity, true);
            }
        }
    
    
        /**
         * StatusBar and NavigationBar transparent
         * @param statusColor StatusBar color
         * @param statusAlpha StatusBar alpha
         * @param applyNav apply NavigationBar or no
         * @param navColor NavigationBar color (applyNav == true)
         * @param navAlpha NavigationBar alpha (applyNav == true)
         */
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private void setTransparentBar(@ColorInt int statusColor, int statusAlpha, boolean applyNav,
                                       @ColorInt int navColor, int navAlpha) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Window window = activity.getWindow();
                View decorView = window.getDecorView();
                int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
                int finalStatusColor = statusColor == 0 ? Color.TRANSPARENT :
                        Color.argb(limitDepthOrAlpha(statusAlpha), Color.red(statusColor),
                                Color.green(statusColor), Color.blue(statusColor));
                window.setStatusBarColor(finalStatusColor);
                if (applyNav) {
                    option = option | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
                    int finalNavColor = navColor == 0 ? Color.TRANSPARENT :
                            Color.argb(limitDepthOrAlpha(navAlpha), Color.red(navColor),
                                    Color.green(navColor), Color.blue(navColor));
                    window.setNavigationBarColor(finalNavColor);
                }
                decorView.setSystemUiVisibility(option);
    
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Window window = activity.getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                ViewGroup decorView = (ViewGroup) window.getDecorView();
                int finalStatusColor = statusColor == 0 ? Color.TRANSPARENT :
                        Color.argb(limitDepthOrAlpha(statusAlpha), Color.red(statusColor),
                                Color.green(statusColor), Color.blue(statusColor));
                decorView.addView(createStatusBarView(activity, finalStatusColor));
                if (applyNav && navigationBarExist(activity)) {
                    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                    int finalNavColor = navColor == 0 ? Color.TRANSPARENT :
                            Color.argb(limitDepthOrAlpha(navAlpha), Color.red(navColor),
                                    Color.green(navColor), Color.blue(navColor));
                    decorView.addView(createNavBarView(activity, finalNavColor));
                }
            }
    
        }
    
    
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private void setColorBarForDrawer(@ColorInt int statusColor, int statusDepth, boolean applyNav,
                                          @ColorInt int navColor, int navDepth) {
            int realStatusDepth = limitDepthOrAlpha(statusDepth);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Window window = activity.getWindow();
                ViewGroup decorView = (ViewGroup) window.getDecorView();
                int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    
                window.setStatusBarColor(Color.TRANSPARENT);
    
                int finalStatusColor = realStatusDepth == 0 ? statusColor : calculateColor(statusColor, realStatusDepth);
                decorView.addView(createStatusBarView(activity, finalStatusColor), 0);
                if (applyNav && navigationBarExist(activity)) {
                    window.setNavigationBarColor(Color.TRANSPARENT);
                    int realNavDepth = limitDepthOrAlpha(navDepth);
                    int finalNavColor = realNavDepth == 0 ? navColor : calculateColor(navColor, realNavDepth);
                    decorView.addView(createNavBarView(activity, finalNavColor), 1);
                    option = option | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
                }
                decorView.setSystemUiVisibility(option);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Window window = activity.getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                ViewGroup decorView = (ViewGroup) window.getDecorView();
                int finalStatusColor = realStatusDepth == 0 ? statusColor : calculateColor(statusColor, realStatusDepth);
                decorView.addView(createStatusBarView(activity, finalStatusColor), 0);
                if (applyNav && navigationBarExist(activity)) {
                    int realNavDepth = limitDepthOrAlpha(navDepth);
                    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                    int finalNavColor = realNavDepth == 0 ? navColor : calculateColor(navColor, realNavDepth);
                    decorView.addView(createNavBarView(activity, finalNavColor), 1);
                }
            }
        }
    
    
        private int limitDepthOrAlpha(int depthOrAlpha) {
            if (depthOrAlpha < 0) {
                return 0;
            }
            if (depthOrAlpha > 255) {
                return 255;
            }
            return depthOrAlpha;
        }
    
    
        private View createStatusBarView(Context context, @ColorInt int color) {
            View statusBarView = new View(context);
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams
                    (FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));
            params.gravity = Gravity.TOP;
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(color);
            return statusBarView;
        }
    
        private View createNavBarView(Context context, @ColorInt int color) {
            View navBarView = new View(context);
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams
                    (FrameLayout.LayoutParams.MATCH_PARENT, getNavigationHeight(context));
            params.gravity = Gravity.BOTTOM;
            navBarView.setLayoutParams(params);
            navBarView.setBackgroundColor(color);
            return navBarView;
        }
    
    
    
        private boolean navigationBarExist(Activity activity) {
            WindowManager windowManager = activity.getWindowManager();
            Display d = windowManager.getDefaultDisplay();
    
            DisplayMetrics realDisplayMetrics = new DisplayMetrics();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                d.getRealMetrics(realDisplayMetrics);
            }
    
            int realHeight = realDisplayMetrics.heightPixels;
            int realWidth = realDisplayMetrics.widthPixels;
    
            DisplayMetrics displayMetrics = new DisplayMetrics();
            d.getMetrics(displayMetrics);
    
            int displayHeight = displayMetrics.heightPixels;
            int displayWidth = displayMetrics.widthPixels;
    
            return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
        }
    
    
    
        @ColorInt
        private int calculateColor(@ColorInt 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;
        }
    
    
    
        private void setRootView(Activity activity, boolean fit) {
            ViewGroup parent = (ViewGroup)activity.findViewById(android.R.id.content);
            for (int i = 0; i < parent.getChildCount(); i++) {
                View childView = parent.getChildAt(i);
                if (childView instanceof ViewGroup) {
                    childView.setFitsSystemWindows(fit);
                    ((ViewGroup)childView).setClipToPadding(fit);
                }
            }
        }
    
    
    
        private int getStatusBarHeight(Context context) {
            Resources resources = context.getResources();
            int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
            return resources.getDimensionPixelSize(resourceId);
        }
    
    
        private int getNavigationHeight(Context context) {
            Resources resources = context.getResources();
            int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
            return resources.getDimensionPixelSize(resourceId);
        }
    
    
    
        public static class ColorBuilder {
    
            @ColorInt
            private int statusColor;
    
            private int statusDepth;
    
            private boolean applyNav;
    
            @ColorInt
            private int navColor;
    
            private int navDepth;
    
            public ColorBuilder statusColor(@ColorInt int statusColor) {
                this.statusColor = statusColor;
                return this;
            }
    
            public ColorBuilder statusDepth(int statusDepth) {
                this.statusDepth = statusDepth;
                return this;
            }
    
            public ColorBuilder applyNav(boolean applyNav) {
                this.applyNav = applyNav;
                return this;
            }
    
            public ColorBuilder navColor(@ColorInt int navColor) {
                this.navColor = navColor;
                return this;
            }
    
            public ColorBuilder navDepth(int navDepth) {
                this.navDepth = navDepth;
                return this;
            }
    
            public UltimateBar build(Activity activity) {
                return new UltimateBar(activity, this);
            }
    
        }
    
        public static class TransparentBuilder {
    
            @ColorInt
            private int statusColor;
    
            private int statusAlpha;
    
            private boolean applyNav;
    
            @ColorInt
            private int navColor;
    
            private int navAlpha;
    
            public TransparentBuilder statusColor(@ColorInt int statusColor) {
                this.statusColor = statusColor;
                return this;
            }
    
            public TransparentBuilder statusAlpha(int statusAlpha) {
                this.statusAlpha = statusAlpha;
                return this;
            }
    
            public TransparentBuilder applyNav(boolean applyNav) {
                this.applyNav = applyNav;
                return this;
            }
    
            public TransparentBuilder navColor(@ColorInt int navColor) {
                this.navColor = navColor;
                return this;
            }
    
            public TransparentBuilder navAlpha(int navAlpha) {
                this.navAlpha = navAlpha;
                return this;
            }
    
            public UltimateBar build(Activity activity) {
                return new UltimateBar(activity, this);
            }
    
        }
    
        public static class ImmersionBuilder {
    
            private boolean applyNav;
    
            public ImmersionBuilder applyNav(boolean applyNav) {
                this.applyNav = applyNav;
                return this;
            }
    
            public UltimateBar build(Activity activity) {
                return new UltimateBar(activity, this);
            }
    
        }
    
        public static class DrawerBuilder {
    
            @ColorInt
            private int statusColor;
    
            private int statusDepth;
    
            private boolean applyNav;
    
            @ColorInt
            private int navColor;
    
            private int navDepth;
    
            public DrawerBuilder statusColor(@ColorInt int statusColor) {
                this.statusColor = statusColor;
                return this;
            }
    
            public DrawerBuilder statusDepth(int statusDepth) {
                this.statusDepth = statusDepth;
                return this;
            }
    
            public DrawerBuilder applyNav(boolean applyNav) {
                this.applyNav = applyNav;
                return this;
            }
    
            public DrawerBuilder navColor(@ColorInt int navColor) {
                this.navColor = navColor;
                return this;
            }
    
            public DrawerBuilder navDepth(int navDepth) {
                this.navDepth = navDepth;
                return this;
            }
    
            public UltimateBar build(Activity activity) {
                return new UltimateBar(activity, this);
            }
    
        }
    
        public static class HideBuilder {
    
            private boolean applyNav;
    
            public HideBuilder applyNav(boolean applyNav) {
                this.applyNav = applyNav;
                return this;
            }
    
            public UltimateBar build(Activity activity) {
                return new UltimateBar(activity, this);
            }
    
        }
    
    
    }
    

你可能感兴趣的:(Android 实现沉浸式(工具类))