4.4特性

作者: 金馆长说 | 来源:发表于2017-08-30 16:59 被阅读49次

    沉浸式体验

    4.4以上的系统支持实现隐藏状态栏,导航栏实现沉浸式的效果。

    单独隐藏状态栏必须在setContextView后调用

    int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(option);
    
    
     View.SYSTEM_UI_FLAG_FULLSCREEN,            //全屏,状态栏和导航栏不显示
                View.SYSTEM_UI_FLAG_HIDE_NAVIGATION,    //隐藏导航栏
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,  //全屏,状态栏会盖在布局上
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION, 
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE,
                View.SYSTEM_UI_FLAG_LOW_PROFILE,
                View.SYSTEM_UI_FLAG_VISIBLE,        //显示状态栏和导航栏
                View.SYSTEM_UI_LAYOUT_FLAGS
    

    隐藏状态栏和导航栏

    @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    

    自定义 StatusBarColor

    android 4.4以上的系统支持自定义statusBar的颜色也就是我们的状态栏颜色。主要是通过获取activity的 window.setStatusBarColor(color)来设置。使用的时候需要判断版本号4.4以上的系统才能这样做。

    这里是一个工具类

    /**
     * Created by Jaeger on 16/2/14.
     * <p/>
     * Email: chjie.jaeger@gamil.com
     * GitHub: https://github.com/laobie
     */
    public class StatusBarUtil {
    
        public static final int DEFAULT_STATUS_BAR_ALPHA = 112;
        private static final int TAG_KEY_HAVE_SET_OFFSET = -123;
        private static final int FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view;
    
    
        /**
         * 设置状态栏颜色
         *
         * @param activity 需要设置的 activity
         * @param color 状态栏颜色值
         */
        public static void setColor(Activity activity, int color) {
            setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA);
        }
    
    
        /**
         * 设置状态栏颜色
         *
         * @param activity 需要设置的activity
         * @param color 状态栏颜色值
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setColor(Activity activity, int color, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow()
                        .clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow()
                        .setStatusBarColor(calculateStatusColor(color, statusBarAlpha));
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                // 生成一个状态栏大小的矩形
                View statusView = createStatusBarView(activity, color, statusBarAlpha);
                // 添加 statusView 到布局中
                ViewGroup decorView = (ViewGroup) activity.getWindow()
                        .getDecorView();
                decorView.addView(statusView);
                setRootView(activity);
            }
        }
    
    
        /**
         * 设置状态栏颜色
         *
         * @param window 需要设置的activity
         * @param color 状态栏颜色值
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setColor(Fragment fragment, Window window, int color, int statusBarAlpha) {
            if (window == null) {
                return;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.setStatusBarColor(calculateStatusColor(color, statusBarAlpha));
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                // 生成一个状态栏大小的矩形
                View statusView = createStatusBarView(fragment
                        .getActivity(), color, statusBarAlpha);
                // 添加 statusView 到布局中
                ViewGroup decorView = (ViewGroup) window.getDecorView();
                decorView.addView(statusView);
                setRootView(fragment);
            }
        }
    
    
        public static void setStatusColor(Activity activity, int color) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Window window = activity.getWindow();
                window.setStatusBarColor(color);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                ViewGroup decorView = (ViewGroup) activity.getWindow()
                        .getDecorView();
                View statusView = decorView.findViewById(R.id.status_bar_view);
                if (statusView == null) {
                    // 生成一个状态栏大小的矩形
                    statusView = createStatusBarView(activity, color);
                    statusView.setId(R.id.status_bar_view);
                    // 添加 statusView 到布局中
                    decorView.addView(statusView);
                    //setRootView(activity);
                } else {
                    statusView.setBackgroundColor(color);
                }
            }
        }
    
    
        public static void setStatusBarFromImg(Activity activity, int color) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Window window = activity.getWindow();
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.getDecorView().setSystemUiVisibility(
                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                                View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.setStatusBarColor(color);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
    
        public static void setStatusBarFromImg(Window window, int color) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.getDecorView().setSystemUiVisibility(
                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                                View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.setStatusBarColor(color);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
    
        /**
         * 设置状态栏纯色 不加半透明效果
         *
         * @param activity 需要设置的 activity
         * @param color 状态栏颜色值
         */
        public static void setColorNoTranslucent(Activity activity, int color) {
            setColor(activity, color, 0);
        }
    
    
        /**
         * 设置状态栏颜色(5.0以下无半透明效果,不建议使用)
         *
         * @param activity 需要设置的 activity
         * @param color 状态栏颜色值
         */
        public static void setColorDiff(Activity activity, int color) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            activity.getWindow()
                    .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            // 生成一个状态栏大小的矩形
            View statusView = createStatusBarView(activity, color);
            // 添加 statusView 到布局中
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            decorView.addView(statusView);
            setRootView(activity);
        }
    
    
        public static void setTranslucent(Fragment fragment, Window window) {
            setTranslucent(fragment, window, DEFAULT_STATUS_BAR_ALPHA);
        }
    
    
        /**
         * 使状态栏半透明
         * <p/>
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity 需要设置的activity
         */
        public static void setTranslucent(Activity activity) {
            setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);
        }
    
    
        /**
         * 使状态栏半透明
         * <p/>
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity 需要设置的activity
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setTranslucent(Activity activity, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparent(activity);
            addTranslucentView(activity, statusBarAlpha);
        }
    
    
        public static void setTranslucent(Fragment fragment, Window window, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparent(fragment, window);
            addTranslucentView(fragment, window, statusBarAlpha);
        }
    
    
        /**
         * 设置状态栏全透明
         *
         * @param activity 需要设置的activity
         */
        public static void setTransparent(Activity activity) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            transparentStatusBar(activity);
            setRootView(activity);
        }
    
    
        public static void setTransparent(Fragment fragment, Window window) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            transparentStatusBar(window);
            setRootView(fragment);
        }
    
    
        /**
         * 使状态栏透明(5.0以上半透明效果,不建议使用)
         * <p/>
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity 需要设置的activity
         */
        public static void setTranslucentDiff(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                // 设置状态栏透明
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                setRootView(activity);
            }
        }
    
    
        /**
         * 为DrawerLayout 布局设置状态栏变色
         *
         * @param activity 需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color 状态栏颜色值
         */
        public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {
            setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA);
        }
    
    
        /**
         * 为DrawerLayout 布局设置状态栏颜色,纯色
         *
         * @param activity 需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color 状态栏颜色值
         */
        public static void setColorNoTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {
            setColorForDrawerLayout(activity, drawerLayout, color, 0);
        }
    
    
        /**
         * 为DrawerLayout 布局设置状态栏变色
         *
         * @param activity 需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color 状态栏颜色值
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow()
                        .clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            } else {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
            // 生成一个状态栏大小的矩形
            View statusBarView = createStatusBarView(activity, color);
            // 添加 statusBarView 到布局中
            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
            contentLayout.addView(statusBarView, 0);
            // 内容布局不是 LinearLayout 时,设置padding top
            if (!(contentLayout instanceof LinearLayout) &&
                    contentLayout.getChildAt(1) != null) {
                contentLayout.getChildAt(1)
                        .setPadding(0, getStatusBarHeight(activity), 0, 0);
            }
            // 设置属性
            ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);
            drawerLayout.setFitsSystemWindows(false);
            contentLayout.setFitsSystemWindows(false);
            contentLayout.setClipToPadding(true);
            drawer.setFitsSystemWindows(false);
    
            addTranslucentView(activity, statusBarAlpha);
        }
    
    
        /**
         * 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用)
         *
         * @param activity 需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color 状态栏颜色值
         */
        public static void setColorForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout, int color) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                // 生成一个状态栏大小的矩形
                View statusBarView = createStatusBarView(activity, color);
                // 添加 statusBarView 到布局中
                ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
                contentLayout.addView(statusBarView, 0);
                // 内容布局不是 LinearLayout 时,设置padding top
                if (!(contentLayout instanceof LinearLayout) &&
                        contentLayout.getChildAt(1) != null) {
                    contentLayout.getChildAt(1)
                            .setPadding(0, getStatusBarHeight(activity), 0, 0);
                }
                // 设置属性
                ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);
                drawerLayout.setFitsSystemWindows(false);
                contentLayout.setFitsSystemWindows(false);
                contentLayout.setClipToPadding(true);
                drawer.setFitsSystemWindows(false);
            }
        }
    
    
        /**
         * 为 DrawerLayout 布局设置状态栏透明
         *
         * @param activity 需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {
            setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA);
        }
    
    
        /**
         * 为 DrawerLayout 布局设置状态栏透明
         *
         * @param activity 需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparentForDrawerLayout(activity, drawerLayout);
            addTranslucentView(activity, statusBarAlpha);
        }
    
    
        /**
         * 为 DrawerLayout 布局设置状态栏透明
         *
         * @param activity 需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTransparentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow()
                        .clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            } else {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
    
            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
            // 内容布局不是 LinearLayout 时,设置padding top
            if (!(contentLayout instanceof LinearLayout) &&
                    contentLayout.getChildAt(1) != null) {
                contentLayout.getChildAt(1)
                        .setPadding(0, getStatusBarHeight(activity), 0, 0);
            }
    
            // 设置属性
            ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);
            drawerLayout.setFitsSystemWindows(false);
            contentLayout.setFitsSystemWindows(false);
            contentLayout.setClipToPadding(true);
            drawer.setFitsSystemWindows(false);
        }
    
    
        /**
         * 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用)
         *
         * @param activity 需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTranslucentForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                // 设置状态栏透明
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                // 设置内容布局属性
                ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
                contentLayout.setFitsSystemWindows(true);
                contentLayout.setClipToPadding(true);
                // 设置抽屉布局属性
                ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1);
                vg.setFitsSystemWindows(false);
                // 设置 DrawerLayout 属性
                drawerLayout.setFitsSystemWindows(false);
            }
        }
    
    
        /**
         * 添加半透明矩形条
         *
         * @param activity 需要设置的 activity
         * @param statusBarAlpha 透明值
         */
        private static void addTranslucentView(Activity activity, int statusBarAlpha) {
            ViewGroup contentView = (ViewGroup) activity
                    .findViewById(android.R.id.content);
            // 移除半透明矩形,以免叠加
            if (contentView.getChildCount() > 1) {
                contentView.removeViewAt(1);
            }
            contentView
                    .addView(createTranslucentStatusBarView(activity, statusBarAlpha));
        }
    
    
        private static void addTranslucentView(Fragment fragment, Window window, int statusBarAlpha) {
            ViewGroup contentView = (ViewGroup) window
                    .findViewById(android.R.id.content);
            if (contentView == null) {
                contentView = (ViewGroup) window.getDecorView();
            }
            // 移除半透明矩形,以免叠加
            if (contentView.getChildCount() > 1) {
                contentView.removeViewAt(1);
            }
            contentView.addView(createTranslucentStatusBarView(fragment
                    .getActivity(), statusBarAlpha));
        }
    
    
        /**
         * 生成一个和状态栏大小相同的彩色矩形条
         *
         * @param activity 需要设置的 activity
         * @param color 状态栏颜色值
         * @return 状态栏矩形条
         */
        private static View createStatusBarView(Activity activity, int color) {
            // 绘制一个和状态栏一样高的矩形
            View statusBarView = new View(activity);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(color);
            return statusBarView;
        }
    
    
        /**
         * 生成一个和状态栏大小相同的半透明矩形条
         *
         * @param context context
         * @param color 状态栏颜色值
         * @param alpha 透明值
         * @return 状态栏矩形条
         */
        private static View createStatusBarView(Context context, int color, int alpha) {
            // 绘制一个和状态栏一样高的矩形
            View statusBarView = new View(context);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
            return statusBarView;
        }
    
    
        /**
         * 设置根布局参数
         */
        private static void setRootView(Activity activity) {
            ViewGroup rootView = (ViewGroup) ((ViewGroup) activity
                    .findViewById(android.R.id.content)).getChildAt(0);
            if (rootView == null) {
                return;
            }
            rootView.setFitsSystemWindows(true);
            rootView.setClipToPadding(true);
        }
    
    
        /**
         * 设置根布局参数
         */
        private static void setRootView(Fragment fragment) {
            View view = fragment.getView();
            if (view != null) {
                view.setFitsSystemWindows(true);
                if (view instanceof ViewGroup) {
                    ((ViewGroup) view).setClipToPadding(true);
                }
            }
        }
    
    
        /**
         * 使状态栏透明
         */
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private static void transparentStatusBar(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow()
                        .clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            } else {
                activity.getWindow()
                        .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
    
        /**
         * 使状态栏透明
         */
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private static void transparentStatusBar(Window window) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                window.setStatusBarColor(Color.TRANSPARENT);
            } else {
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
    
        /**
         * 创建半透明矩形 View
         *
         * @param alpha 透明值
         * @return 半透明 View
         */
        private static View createTranslucentStatusBarView(Activity activity, int alpha) {
            // 绘制一个和状态栏一样高的矩形
            View statusBarView = new View(activity);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));
            return statusBarView;
        }
    
    
        /**
         * 获取状态栏高度
         *
         * @param context context
         * @return 状态栏高度
         */
        public static int getStatusBarHeight(Context context) {
            // 获得状态栏高度
            int resourceId = context.getResources()
                    .getIdentifier("status_bar_height", "dimen", "android");
            return context.getResources().getDimensionPixelSize(resourceId);
        }
    
    
        /**
         * 计算状态栏颜色
         *
         * @param color color值
         * @param alpha alpha值
         * @return 最终的状态栏颜色
         */
        private static int calculateStatusColor(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;
        }
    
    
        /**
         * 设置view添加状态栏高度和设置padding,适用于图片填充到状态栏
         *
         * @param view 需要添加padding的view
         * @param height 该view的原始高度,单位px
         */
        public static void setViewAddStatusPadding(View view, int height) {
            if (view == null ||
                    Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            int barHeight = StatusBarUtil.getStatusBarHeight(view.getContext());
            ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
            layoutParams.height = height + barHeight;
            view.setPadding(view.getPaddingLeft(),
                    view.getPaddingTop() + barHeight, view.getPaddingRight(), view
                            .getPaddingBottom());
            view.setMinimumHeight(barHeight);
        }
    
    
        /**
         * 为 fragment 头部是 ImageView 的设置状态栏半透明
         *
         * @param activity fragment 对应的 activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageViewInFragment(Activity activity, View needOffsetView) {
            setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);
        }
    
    
        /**
         * 为 fragment 头部是 ImageView 的设置状态栏全透明
         *
         * @param activity fragment 对应的 activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTransparentForImageViewInFragment(Activity activity, View needOffsetView) {
            setTranslucentForImageViewInFragment(activity, 0, needOffsetView);
        }
    
    
        /**
         * 为 fragment 头部是 ImageView 的设置状态栏透明
         *
         * @param activity fragment 对应的 activity
         * @param statusBarAlpha 状态栏透明度
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageViewInFragment(Activity activity, int statusBarAlpha, View needOffsetView) {
            setTranslucentForImageView(activity, statusBarAlpha, needOffsetView);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT &&
                    Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                clearPreviousSetting(activity);
            }
        }
    
    
        /**
         * 为头部是 ImageView 的界面设置状态栏透明
         *
         * @param activity 需要设置的activity
         * @param statusBarAlpha 状态栏透明度
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparentForWindow(activity);
            addTranslucentView(activity, statusBarAlpha);
            if (needOffsetView != null) {
                Object haveSetOffset = needOffsetView
                        .getTag(TAG_KEY_HAVE_SET_OFFSET);
                if (haveSetOffset != null && (Boolean) haveSetOffset) {
                    return;
                }
                ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView
                        .getLayoutParams();
                layoutParams.setMargins(layoutParams.leftMargin,
                        layoutParams.topMargin +
                                getStatusBarHeight(activity), layoutParams.rightMargin, layoutParams.bottomMargin);
                needOffsetView.setTag(TAG_KEY_HAVE_SET_OFFSET, Boolean.TRUE);
            }
        }
    
    
        /**
         * 设置透明
         */
        private static void setTransparentForWindow(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
                activity.getWindow().getDecorView().setSystemUiVisibility(
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
                                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow()
                        .setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
    
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private static void clearPreviousSetting(Activity activity) {
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            View fakeStatusBarView = decorView
                    .findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                decorView.removeView(fakeStatusBarView);
                ViewGroup rootView = (ViewGroup) ((ViewGroup) activity
                        .findViewById(android.R.id.content)).getChildAt(0);
                rootView.setPadding(0, 0, 0, 0);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:4.4特性

          本文链接:https://www.haomeiwen.com/subject/gjkxjxtx.html