效果图:
首先将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中调用该方法
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