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

Android 状态栏虚拟导航键透明效果的实现方法

程序员文章站 2023-11-27 09:00:34
状态栏和虚拟导航键 4.4上半透明,5.0以上可以全透明 先上效果 4.4 半透明效果 5.0及以上 全透明效果 上代码 mainactivity代码...

状态栏和虚拟导航键 4.4上半透明,5.0以上可以全透明

先上效果

4.4 半透明效果

Android 状态栏虚拟导航键透明效果的实现方法

5.0及以上 全透明效果

Android 状态栏虚拟导航键透明效果的实现方法

上代码

mainactivity代码

public class mainactivity extends appcompatactivity {
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    // 隐藏标题栏
    supportrequestwindowfeature(window.feature_no_title);
    view root = layoutinflater.from(this).inflate(r.layout.activity_main, null);
    // 或者 在界面的根层加入 android:fitssystemwindows=”true” 这个属性,这样就可以让内容界面从 状态栏 下方开始。
    viewcompat.setfitssystemwindows(root, true);
    setcontentview(root);
    if (build.version.sdk_int >= build.version_codes.lollipop) {
      // android 5.0 以上 全透明
      window window = getwindow();
      window.clearflags(windowmanager.layoutparams.flag_translucent_status
          | windowmanager.layoutparams.flag_translucent_navigation);
      window.getdecorview().setsystemuivisibility(view.system_ui_flag_layout_fullscreen
          | view.system_ui_flag_layout_hide_navigation
          | view.system_ui_flag_layout_stable);
      window.addflags(windowmanager.layoutparams.flag_draws_system_bar_backgrounds);
      // 状态栏(以上几行代码必须,参考setstatusbarcolor|setnavigationbarcolor方法源码)
      window.setstatusbarcolor(color.transparent);
      // 虚拟导航键
      window.setnavigationbarcolor(color.transparent);
    } else if (build.version.sdk_int >= build.version_codes.kitkat) {
      // android 4.4 以上 半透明
      window window = getwindow();
      // 状态栏
      window.addflags(windowmanager.layoutparams.flag_translucent_status);
      // 虚拟导航键
      window.addflags(windowmanager.layoutparams.flag_translucent_navigation);
    }
  }
}

activity_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<relativelayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@color/colorprimary"
  >
  <textview
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="hello world!"
    />
</relativelayout>

5.0以上的几行代码不是很懂,从源码看是需要添加的,以后找到这几个方法是做什么用的再回来注明

setstatusbarcolor源码

/**
   * sets the color of the status bar to {@code color}.
   *
   * for this to take effect,
   * the window must be drawing the system bar backgrounds with
   * {@link android.view.windowmanager.layoutparams#flag_draws_system_bar_backgrounds} and
   * {@link android.view.windowmanager.layoutparams#flag_translucent_status} must not be set.
   *
   * if {@code color} is not opaque, consider setting
   * {@link android.view.view#system_ui_flag_layout_stable} and
   * {@link android.view.view#system_ui_flag_layout_fullscreen}.
   * <p>
   * the transitionname for the view background will be "android:status:background".
   * </p>
   */
  public abstract void setstatusbarcolor(@colorint int color);

setnavigationbarcolor源码方法

 /**
   * sets the color of the navigation bar to {@param color}.
   *
   * for this to take effect,
   * the window must be drawing the system bar backgrounds with
   * {@link android.view.windowmanager.layoutparams#flag_draws_system_bar_backgrounds} and
   * {@link android.view.windowmanager.layoutparams#flag_translucent_navigation} must not be set.
   *
   * if {@param color} is not opaque, consider setting
   * {@link android.view.view#system_ui_flag_layout_stable} and
   * {@link android.view.view#system_ui_flag_layout_hide_navigation}.
   * <p>
   * the transitionname for the view background will be "android:navigation:background".
   * </p>
   */
  public abstract void setnavigationbarcolor(@colorint int color);

fitssystemwindows属性需设置为true,否则布局会和状态栏重叠

如图:

Android 状态栏虚拟导航键透明效果的实现方法 

两种方式:

方式一(xml文件根布局添加属性):

android:fitssystemwindows=”true”

方式二(代码中设置):

viewcompat.setfitssystemwindows(rootview, true);

其实还有第三种方式解决此问题,获取状态栏高度,在最上设置一个等高的view

/**
   * 获取状态栏高度
   * @return
   */
  public int getstatusbarheight() {
    int statusbarheight = 0;
    int resourceid = getresources().getidentifier("status_bar_height", "dimen", "android");
    if (resourceid > 0) {
      statusbarheight = getresources().getdimensionpixelsize(resourceid);
    }
    return statusbarheight;
  }

源码地址:https://github.com/stormsuncc/mycompatstatusbar

以上所述是小编给大家介绍的android 状态栏虚拟导航键透明效果的实现方法,希望对大家有所帮助