当前位置: 首页 > 工具软件 > Status Wolf > 使用案例 >

StatusBar透明与Activity全屏

上官波鸿
2023-12-01

一、StatusBar透明,title布局延伸到statusbar底部显示,title留出status空间不与statusbar显示重叠

1.首先,在activity中写如下代码:

Window window = getWindow();
//透明状态栏,分为sdk>21、21>sdk>19情况设置,sdk<19不支持
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    View decorView = getWindow().getDecorView();
    int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    decorView.setSystemUiVisibility(option);
    window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    // Translucent status bar
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

这个放在setContentView()方法之前。

这样,布局就从statusbar底部开始绘制了。但是就会发现,这样原来的布局内容和statusbar内容重叠了。

2.在对应的xml中,找到和statusbar重叠绘制的根布局(viewgroup),在对应的布局中加入:

android:fitsSystemWindows="true"属性

这样,系统会把这个布局(viewgroup)的高度留出statusbar的高度(大约20dp)来绘制statusbar,相当于增加了20dp的paddingTop效果,所以该布局的高度需要根据sdk版本不同,提供不同高度。比如titlebar的本来想要48dp,那么,

在values-v19的文件夹里,新建dimen.xml,增加paddingTop = 20dp的高度,就是68dp:

<dimen name="top_bar_height">68dp</dimen>

在values文件夹里,新建dimen.xml,(即sdk小于19的手机里,不需要为statusbar留出20dp高度,因为它不支持在statusbar下面绘制),所以就应该是原有大小48dp

<dimen name="top_bar_height">48dp</dimen>

这样,在对应的布局中,引用"@dimen/top_bar_height"作为布局的高度,当sdk>= 19时,根布局的高度就会多20dp paddingTop效果,根布局的子布局从y = 20dp下面才开始绘制;当sdk<19时,使用正常的布局高度,不延伸到statusbar底部绘制,因为sdk<19的系统不支持。

注意:

1.android:fitsSystemWindows="true"会将viewGroup添加20dp paddingTop的效果,所以viewGroup的backgroud内容可以延伸到statusbar的底部重叠绘制,但是viewgroup的子view,是在paddingTop = 20dp下面的位置开始绘制的。

这个属性可以给任何view设置,只要设置了这个属性,并且设置了透明状态栏(StatusBar)或者导航栏(NavigationBar),此view的所有padding属性失效.

在设置了透明状态栏(StatusBar)或者导航栏(NavigationBar)时,此属性才会生效,分别相当于增加statusbar高度的paddingTop和navigationbar高度的paddingbottom效果。

注意:现在的手机状态栏高度有的不是20dp了,需要动态获取,参考:https://blog.csdn.net/a_running_wolf/article/details/50477965  建议使用第一个方法。

val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
val statusBarHeight = if (resourceId > 0) {
    resources.getDimensionPixelSize(resourceId)
} else {
    context.resources.getDimension(R.dimen.dimens_20dp).toInt()
}

2.有的手机,可能还需要在viewgroup中加入android:clipToPadding="true"属性,一般这个属性默认就是true。

二、Activity全屏

在onCreate方法中,setContentView()之前,写如下代码即可:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    int systemUiVisibility = getWindow().getDecorView().getSystemUiVisibility();
    int flags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View
            .SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
            | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    systemUiVisibility |= flags;
    getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility);
} else {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams
            .FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

这里也区分了sdk是否大于19。这样,不但statusbar被隐藏,华为的屏幕下面的虚拟按键也会被隐藏,真正实现全屏。

 类似资料: