美文网首页
沉浸式状态栏

沉浸式状态栏

作者: just0119 | 来源:发表于2019-03-08 17:53 被阅读0次

    android Api21之后的状态栏会默认覆盖半透明遮罩,我们需要新建values-19,values-21 2份styles文件进行适配

    Api-19
     <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <item name="android:windowTranslucentStatus">true</item>
            <item name="android:windowTranslucentNavigation">true</item>
     </style>
    Api-21
     <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <item name="android:windowTranslucentStatus">false</item>
            <item name="android:windowTranslucentNavigation">true</item>
            <item name="android:statusBarColor">@android:color/transparent</item>
     </style>
    
    02dcb82d382be8e958a4245dee2465d.jpg
    假如需要去除状态栏需要在Activity中添加
    
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    d8b9a347144e379b5c86f80fe716466.jpg
    这种情况下,布局内容会延伸到状态栏,假如我们需要状态栏显示需要另外做处理
    
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:statusBarColor">#ff0000</item>
    </style>
    // 或者通过代码
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    getWindow().setStatusBarColor(Color.BLUE);
    
    • 对于5.0以下的设备我们需要手动添加一个占位view来模拟状态栏显示
    private void addStatusBarColor() {
        ViewGroup mViewGroup = findViewById(android.R.id.content);
        View mStatusView = new View(this);
        ViewGroup.LayoutParams mParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusBarHeight());
        mStatusView.setBackgroundColor(Color.BLUE);
        mViewGroup.addView(mStatusView,mParams);
    }
    
    /**
     * 通过反射拿到状态栏高度
     */
    private int getStatusBarHeight() {
        int height = 0;
        int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if(resId > 0){
           height = getResources().getDimensionPixelSize(resId);
        }
        return height;
    }
    
    • 我们可以对版本做一个判断
    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().setStatusBarColor(Color.BLUE);
    } else if(Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT){
        ViewGroup mViewGroup = findViewById(android.R.id.content);
        View mStatusView = new View(this);
        ViewGroup.LayoutParams mParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusBarHeight());
        mStatusView.setBackgroundColor(Color.BLUE);
        mViewGroup.addView(mStatusView,mParams);
    }
    

    以上都需要添加在布局中添加fitsSystemWindow = true ,或者在代码中进行设置

    public void setRootViewFitsSystemWindows() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            ViewGroup winContent = findViewById(android.R.id.content);
            if (winContent.getChildCount() > 0) {
                ViewGroup rootView = (ViewGroup) winContent.getChildAt(0);
                if (rootView != null) {
                    rootView.setFitsSystemWindows(true);
                }
            }
        }
    }
    
    9ba64c82d2450d873fccc6c2545b883.jpg
    • 假如我们设置状态栏颜色较浅会看不清状态栏字体,除了小米和魅族对底层代码做了处理,其余需要使用到6.0 的一个新属性SYSTEM_UI_FLAG_LIGHT_STATUS_BAR该属性可以兼容亮色背景。该属性需要在设置了FLAG_DRAWS_SYSTEM_BAR_BACKGROUND和清除FLAG_TRANSLUCENT_STATUS属性才能使用
    // 代码设置
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    }
    // 新建values-v23文件夹
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">#fff</item>
        <!-- Android 6.0以上 状态栏字色和图标为浅黑色-->
        <item name="android:windowLightStatusBar">true</item>
    </style>
    
    899a9f36f7e795e0808aab24c324fb3.jpg
    6a5446429a3ed4ea81c429711ac21b9.jpg

    相关文章

      网友评论

          本文标题:沉浸式状态栏

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