欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详解Android沉浸式实现兼容解决办法

程序员文章站 2022-07-11 17:57:22
自android5.0开始,沉浸式状态栏似乎成为一种潮流,应用里缺少沉浸式总感觉少些什么。于是乎,我开始到处找如何兼容低版本的沉浸式,由于android平台跨度问题,总遇到...

自android5.0开始,沉浸式状态栏似乎成为一种潮流,应用里缺少沉浸式总感觉少些什么。于是乎,我开始到处找如何兼容低版本的沉浸式,由于android平台跨度问题,总遇到一些不如人意的问题。终于,皇天不负有心人,通过参考一些网络上的资料以及开发的一些经验,总结出一个可行的且良好的解决方案!

先介绍下,什么是沉浸式状态栏?

沉浸式,要求在应用中android状态栏(statusbar)与标题栏(actionbar/toolbar)要拥有相同的颜色,或者使用同一张图的连续背景。

详解Android沉浸式实现兼容解决办法

详解Android沉浸式实现兼容解决办法

话不多说,亮剑吧!

具体实现需要针对不同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"

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。