Android实现隐藏手机底部虚拟按键

现在的手机比较流行底部带虚拟按键,比如华为、nexus,一般情况下对开发一个APP没啥影响,但是不一般情况下就会有影响的,比如全屏录像功能,

用简单的方法直接获取camera支持的手机屏幕分辨率然后用SurfaceView全屏渲染出来,这时由于底部虚拟按键占用了一定的高度的屏幕空间,这时图像会被压缩,

特别是拍头像时会很明显,如图:

接下来加上几个方法就OK 了,代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/**

   * 隐藏虚拟按键,并且全屏

 */

  protected void hideBottomUIMenu(){

    //隐藏虚拟按键,并且全屏

    if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api

      View v = this.getWindow().getDecorView();

      v.setSystemUiVisibility(View.GONE);

    } else if (Build.VERSION.SDK_INT >= 19) {

      //for new api versions.

      View decorView = getWindow().getDecorView();

      int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE

          | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

          | 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;

      decorView.setSystemUiVisibility(uiOptions);

      getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

    }

  }

检查是否存在虚拟按键栏

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

/**

   * 检查是否存在虚拟按键栏

   * @param context

   * @return

   */

  public static boolean hasNavBar(Context context) {

    Resources res = context.getResources();

    int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");

    if (resourceId != 0) {

      boolean hasNav = res.getBoolean(resourceId);

      // check override flag

      String sNavBarOverride = getNavBarOverride();

      if ("1".equals(sNavBarOverride)) {

        hasNav = false;

      } else if ("0".equals(sNavBarOverride)) {

        hasNav = true;

      }

      return hasNav;

    } else { // fallback

      return !ViewConfiguration.get(context).hasPermanentMenuKey();

    }

  }

  

  /**

   * 判断虚拟按键栏是否重写

   * @return

   */

  private static String getNavBarOverride() {

    String sNavBarOverride = null;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

      try {

        Class c = Class.forName("android.os.SystemProperties");

        Method m = c.getDeclaredMethod("get", String.class);

        m.setAccessible(true);

        sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");

      } catch (Throwable e) {

      }

    }

    return sNavBarOverride;

  }

hideBottomUIMenu() 在onCreate()里面调用就可以了,之后的效果,底部虚拟按键也成为了SurfaceView的一部分,不仅仅只是透明了哦,如图:

当然以上代码不一定只能用于录像,相关功能需求都可以使用。

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

您可能感兴趣的文章:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要彻底隐藏Android设备上的底部虚拟按键,您可以尝试以下两种方法: 方法一:使用全屏模式 通过使用全屏模式,您可以完全隐藏底部虚拟按键。以下是实现此目的的步骤: 1. 在您的Android应用程序中,打开您想要隐藏底部虚拟按键的活动。 2. 在该活动的onCreate()方法中添加以下代码: ```java View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); ``` 这将隐藏底部导航栏和状态栏。 3. 在该活动的onResume()方法中添加以下代码: ```java View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); ``` 这将确保当用户返回到该活动时,底部导航栏和状态栏仍然被隐藏。 方法二:使用系统UI调节器 使用系统UI调节器,您可以在整个Android设备上隐藏底部虚拟按键。以下是实现此目的的步骤: 1. 打开您的Android设备上的设置应用程序。 2. 寻找“开发者选项”并打开它。 3. 滚动到“绘画”部分,并找到“禁用虚拟按键”选项。启用此选项。 4. 按下设备上的电源键,然后再按下“禁用虚拟按键”选项。此时,底部导航栏将被隐藏。 请注意,使用该选项可能会导致一些应用程序无法正常工作。如果您遇到任何问题,请在开发者选项中禁用此选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值