当前位置: 移动技术网 > 移动技术>移动开发>Android > 详解Android沉浸式实现兼容解决办法

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

自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"

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网