美文网首页安卓开发手机移动程序开发UI
Android 开发技巧 - Android 4.4及以上实现沉

Android 开发技巧 - Android 4.4及以上实现沉

作者: chenyk | 来源:发表于2017-09-16 23:11 被阅读71次

    转载请注明出处,感谢您的支持。同时,欢迎加入移动开发学习交流qq群 : 450302004,互相学习。
    文章来源:【chenyk的简书】http://www.jianshu.com/p/ef52c16872e6

    简单说明


    为Android 4.4及以上提供状态栏和系统栏的半透明效果,也就是大部分人所说的沉浸式效果,同时支持图片可浸入状态栏和导航栏,通过链试调用的方式进行设置

    效果图


    • Android 4.4 效果


      Android 4.4 效果.jpg
    • Android 5.1 效果


      Android 5.1 效果.jpg
    • Android 6.0 效果


      Android 6.0.jpg

    github地址


    https://github.com/chenykKits/LutoSystemBar

    apk下载


    V1.0.0

    更新日志


    V1.0.0

    • 为不同安卓版本适配沉浸式效果,仅对Android 4.4及以上有效
    • 修改状态栏、导航栏颜色和透明度
    • 图片可浸入状态栏和导航栏

    用法


    1. 下载配置
    • Android studio用户,可在项目中的 build.gradle 文件中添加如下引用
    dependencies {
        compile 'android.dev.chenyk:lutosystembar:1.0.0'
    }
    
    • Eclipse,将下载下来的aar包放入libs包中,点我下载
    1. 方法调用
    LutoSystemBar.Builder(activity)
                    .setStatusBarType(StatusBarType.PURECOLOR)//设置状态栏类型
                    .setSystemBarColor(Color.parseColor("#FF4081"))//设置系统栏整体颜色
                    .setSystemBarColorRes(R.color.colorPrimary)//设置系统栏整体颜色
                    .setStatusBarColor(Color.parseColor("#FF4081"))//设置状态栏颜色,优先级高于SystemBarColor
                    .setStatusBarColorRes(R.color.colorPrimary)//设置状态栏颜色,优先级高于SystemBarColor
                    .translucentNavigationBar()//是否半透明状态栏
                    .setNavigationBarColor(Color.parseColor("#FF4081"))//设置导航栏颜色,优先级高于SystemBarColor,必须调用translucentNavigationBar()方法之后才有效
                    .setNavigationBarColorRes(R.color.colorPrimary)//设置导航栏颜色,优先级高于SystemBarColor,必须调用translucentNavigationBar()方法之后才有效
                    .setSystemBarAlpha(80)//设置系统栏整体透明度
                    .setStatusBarAlpha(80)//设置状态栏透明度,优先级高于SystemBarAlpha
                    .setNavigationBarAlpha(80)//设置导航栏透明度,优先级高于SystemBarAlpha,必须调用translucentNavigationBar()方法之后才有效
                    .translucentForImageView(titleView)//设置图片进入状态栏时,要下移的视图
                    .build();//调用此方法参数配置才会生效
    

    关键代码说明

    • 针对不同Android版本将状态栏和导航栏透明
        /**
         * 为状态栏配置半透明效果
         */
        private void translucentStatusBarConfigForNarmal() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//安卓6.0及以上
                mWindow.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                mWindow.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//安卓4.4~6.0
                mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
        /**
         * 为实现图片浸入状态栏或导航栏效果的情况,设置相关窗口配置
         * 默认此情况下,状态栏颜色不可修改,如果非要修改,则需调用{@link #changeStatusColorForImageView()}开启功能
         */
        private void translucentStatusBarConfigForImageview() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                mWindow.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M &&
                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
       /**
         * 配置导航栏半透明效果
         */
        private void translucentNavBarConfig() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//安卓6.0及以上
                if (mSystemBarConfigBean.isTranslucentForImageView) {
                    //图片浸入导航栏时配置
                    mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                } else {
                    mWindow.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                }
            } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//安卓4.4~6.0
                mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            }
        }
    
    • 针对不同Android版本修改状态栏和导航栏的颜色和透明度
      自Android 6.0以后,系统提供了状态栏和导航栏的颜色设置方法,只需调用设置即可;而对于6.0以下4.4以上的系统,则需要通过绘制一个跟状态栏高度一致的矩形条才能实现效果。
        /**
         * 修改系统栏颜色
         *
         * @param statusBarColor
         * @return
         */
        private LutoSystemBar changeSystemBarColor(int statusBarColor) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return this;
            int navigationBarColorResult = BarConversionUtil.calculateColorWithAlpha(
                    BarResUtil.getColor(mActivity, getNavigationBarColor()), getNavigationBarAlpha());
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//安卓6.0及以上
                mWindow.setStatusBarColor(statusBarColor);
                mWindow.setNavigationBarColor(navigationBarColorResult);
            } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//安卓4.4~6.0
                StatusBarView.addStatusBarView(mActivity, statusBarColor);
            }
            return this;
        }
    
    • 普通模式下,需要配置根布局参数
        /**
         * 根布局设置
         */
        @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        private void setRootView() {
            try {
                ViewGroup rootViewGroup = (ViewGroup) ((ViewGroup) mActivity.findViewById(android.R.id.content)).getChildAt(0);
                rootViewGroup.setFitsSystemWindows(true);
                rootViewGroup.setClipToPadding(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    写在最后,希望以上内容能帮到您,不定时总结和记录个人的经验。您的支持是我前进的动力,经验分享是美德

    相关文章

      网友评论

        本文标题:Android 开发技巧 - Android 4.4及以上实现沉

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