美文网首页
Android沉浸状态栏实现记录

Android沉浸状态栏实现记录

作者: XBYoung | 来源:发表于2020-01-17 12:17 被阅读0次

    沉浸状态栏是应用开发必不可少一部分,以前开发得过且过,能用则用,后面多次开发发现都会使用,还是整理记录以便记忆和复用。4.4及以上使用,低于4.4不予实现此功能

    项目初建

    image.png

    删除ActionBar

    大部分开发不会使用默认提供的ActionBar,先去掉,App使用的主题继承自NoActionBar系列主题

     <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>
    
    image.png

    浸入状态栏

     /**
         * 使状态栏透明并浸入
         */
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private static void transparentStatusBar(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                    //5.0以下爆炸
                    activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
                }
            }
        }
    
    image.png

    Title顶出状态栏

     private static void setRootView(Activity activity) {
            ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);
            for (int i = 0, count = parent.getChildCount(); i < count; i++) {
                View childView = parent.getChildAt(i);
                if (childView instanceof ViewGroup) {
                    childView.setFitsSystemWindows(true);
                    ((ViewGroup) childView).setClipToPadding(true);
                }
            }
        }
    
    image.png

    更改Title颜色

    4.4 直接加入一个相同颜色模块

      public static void setColor(Activity activity, @ColorInt int color, @IntRange(from = 0, to = 255) int statusBarAlpha) {
            //5.0以上版本直接设置状态栏颜色透明度
            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));
                //4.4-5.0版本通过伪装一个状态栏来设置颜色和透明度
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
                decorView.addView(createStatusBarView(activity, color, statusBarAlpha));
                setRootView(activity);
            }
        }
    
       private static View createStatusBarView(Activity activity, @ColorInt int color, int alpha) {
            // 绘制一个和状态栏一样高的矩形
            View statusBarView = new View(activity);
            LinearLayout.LayoutParams params =
                    new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
            return statusBarView;
        }
    
    image.png

    相关文章

      网友评论

          本文标题:Android沉浸状态栏实现记录

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