详解Android沉浸式实现兼容解决办法
程序员文章站
2022-07-11 17:57:22
自android5.0开始,沉浸式状态栏似乎成为一种潮流,应用里缺少沉浸式总感觉少些什么。于是乎,我开始到处找如何兼容低版本的沉浸式,由于android平台跨度问题,总遇到...
自android5.0开始,沉浸式状态栏似乎成为一种潮流,应用里缺少沉浸式总感觉少些什么。于是乎,我开始到处找如何兼容低版本的沉浸式,由于android平台跨度问题,总遇到一些不如人意的问题。终于,皇天不负有心人,通过参考一些网络上的资料以及开发的一些经验,总结出一个可行的且良好的解决方案!
先介绍下,什么是沉浸式状态栏?
沉浸式,要求在应用中android状态栏(statusbar)与标题栏(actionbar/toolbar)要拥有相同的颜色,或者使用同一张图的连续背景。
话不多说,亮剑吧!
具体实现需要针对不同android版本做处理,还有针对decorview做处理以及做activity的xml布局文件根布局控件做属性处理。
java代码,设置沉浸式的方法
/** * 设置沉浸式状态栏颜色 * * @param colorresid 状态栏颜色 */ protected void setimmersivestatusbarcolor(@colorres int colorresid) { int flags = view.system_ui_flag_layout_stable | view.system_ui_flag_layout_fullscreen; if (build.version.sdk_int >= build.version_codes.lollipop) { int statusbarcolor = apkutil.getcolor(this, colorresid); //① float lightdegress = (color.red(statusbarcolor) + color.green(statusbarcolor) + color.blue(statusbarcolor)) / 3; //作色彩亮度判断,好针对颜色做相应的状态栏的暗色还是亮色。 if ((lightdegress > 200 || lightdegress == 0) && build.version.sdk_int > build.version_codes.m) rootview.setsystemuivisibility(view.system_ui_flag_light_status_bar); window.clearflags(windowmanager.layoutparams.flag_translucent_status); window.setstatusbarcolor(statusbarcolor); } else if (build.version.sdk_int >= build.version_codes.kitkat) { window.addflags(windowmanager.layoutparams.flag_translucent_status); rootview.setsystemuivisibility(flags | view.system_ui_flag_immersive | view.system_ui_flag_immersive_sticky); } else if (build.version.sdk_int >= build.version_codes.jelly_bean) { rootview.setsystemuivisibility(flags); } if (build.version.sdk_int <= build.version_codes.kitkat) { //当api小于等于19,此时为了实现沉浸式状态栏,需要添加一个view来做statusbar背景控件 final boolean ishasstatusbarview = rootview.gettag() != null; view statusbarview = !ishasstatusbarview ? new view(this) : (view)rootview.gettag(); statusbarview.setbackgroundresource(colorresid); if(!ishasstatusbarview) { rootview.settag(statusbarview); statusbarview.setlayoutparams(new framelayout.layoutparams(framelayout.layoutparams.match_parent, viewutil.getstatusbarheight(this))); //② rootview.addview(statusbarview); } } }
注:此处针对rootview(即decorview)、window的获取不再陈述!
①.apkutil.getcolor(this, colorresid)
/** * 获取颜色资源 * @param context 上下文对象 * @param colorid 颜色resid * @return */ @suppresswarnings("deprecation") public static int getcolor(context context, int colorid) { if (build.version.sdk_int >= build.version_codes.m) { return context.getcolor(colorid); } return context.getresources().getcolor(colorid); }
②. 获取状态栏高度
/** * 获取状态栏高度 * @param context 上下文对象 */ @jvmstatic @suppresslint("privateapi") fun getstatusbarheight(context: context): int { val clazz = class.forname("com.android.internal.r\$dimen") val obj = clazz?.newinstance() val field = clazz.getfield("status_bar_height") field?.let { field.isaccessible = true val x = integer.parseint(field.get(obj).tostring()) return context.resources.getdimensionpixelsize(x) } return 75 }
activity布局xml根布局添加以下属性
android:fitssystemwindows="true" android:cliptopadding="false"
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。