Android 状态栏背景设置与状态栏背景图片的延伸?

导读:本篇文章讲解 Android 状态栏背景设置与状态栏背景图片的延伸?,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

效果图:

Android 状态栏背景设置与状态栏背景图片的延伸?      Android 状态栏背景设置与状态栏背景图片的延伸?

首先将styles文件的AppTheme改为无标题栏 即:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

一、Android

1.状态栏背景图片的延伸:首先设置实现方法 fullScreen()

/**
 * 通过设置全屏,设置状态栏透明
 */
private void fullScreen(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色
            Window window = activity.getWindow();
            View decorView = window.getDecorView();
            //两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        } else {
            Window window = activity.getWindow();
            WindowManager.LayoutParams attributes = window.getAttributes();
            int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
            attributes.flags |= flagTranslucentStatus;
            window.setAttributes(attributes);
        }
    }
}

再次在Activity中调用该方法

Android 状态栏背景设置与状态栏背景图片的延伸?

2.状态栏背景颜色的设置: 首先创建实现方法 initSystemBar()

/**
 * 状态栏
 *themeBg:颜色值(在color设置直接调用即可)
 */
@SuppressLint("InlinedApi")
public void initSystemBar(Context mContext, int themeBg) {
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        //取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        //设置状态栏颜色
        window.setStatusBarColor(ContextCompat.getColor(mContext, themeBg));

        //状态栏颜色接近于白色,文字图标变成黑色
        View decor = window.getDecorView();
        int ui = decor.getSystemUiVisibility();
        //light --> a|=b的意思就是把a和b按位或然后赋值给a,   按位或的意思就是先把a和b都换成2进制,然后用或操作,相当于a=a|b
        ui = ui | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
        decor.setSystemUiVisibility(ui);
    }
}

再次在Activity的onCreate方法中调用

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    initSystemBar(MainActivity2.this ,R.color.colorAccent);
}

二、Kotlin

2.1.设置状态栏背景图片

/**
 * 沉浸式状态栏
 */
@SuppressLint("ObsoleteSdkInt")
fun initState() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        //5.0 全透明实现
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.setStatusBarColor(Color.TRANSPARENT)
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        //4.4 全透明状态栏
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    }
}

再次该方法需要在setContentView()方法之前调用(同上)

2.2.设置状态栏背景颜色方法

fun initSystemBar(isLight: Boolean, themeBg: Int) {
    if (Build.VERSION.SDK_INT >= 21) {
        val window = window
        //取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        //设置状态栏颜色
        if (isLight) {
            window.statusBarColor = ContextCompat.getColor(mContext, themeBg)
        } else {
            window.statusBarColor = ContextCompat.getColor(mContext, R.color.transparent)
        }

        //状态栏颜色接近于白色,文字图标变成黑色
        val decor = window.decorView
        var ui = decor.systemUiVisibility
        ui = if (isLight) {
            //light --> a|=b的意思就是把a和b按位或然后赋值给a,   按位或的意思就是先把a和b都换成2进制,然后用或操作,相当于a=a|b
            ui or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        } else {
            //dark  --> &是位运算里面,与运算,  a&=b相当于 a = a&b,  ~非运算符
            ui and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
        }
        decor.systemUiVisibility = ui
    }
}

再次调用方式同上

这样我们就可以完成各种状态栏的设置了,可以很好地匹配我们不同Activity了。对你有所帮助请点赞!!!

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/119191.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!