android 系统隐藏和显示虚拟按键的几种方法

几种动态显示虚拟按键的方法


上一篇从源码来看了虚拟按键的加载显示流程
android 虚拟按键流程分析
,今天来看看虚拟的几种动态显示和隐藏的方法。

其实说到虚拟按键,对于市面上面的很多手机,各种需求都不一样,有的手机有虚拟按键,有的手机没有。今天我就来就各种需要隐藏显示虚拟按键的需求来说说。

1. 我的手机默认是带虚拟按键的,我是一个开发app的人员,我的app的某个activity需要全屏显示,即需要隐藏掉虚拟按键。

int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE;
window.getDecorView().setSystemUiVisibility(uiOptions); // 使用activity的window是隐藏虚拟按键。
getWindow().setNavigationBarColor(Color.parseColor("#1bb5d7")); //设置虚拟按键的背景颜色

这里已经可以隐藏掉虚拟按键了,如果还需要其他需求,可以选择性的加入以下:

        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);
        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

2. 我是系统开发的,整个系统完全不需要显示虚拟按键,应该如何屏蔽掉虚拟按键

看过我上一篇的文章的android 虚拟按键流程分析,应该可以发现虚拟按键有一个开关

frameworks\base\core\res\res\values\config.xml

    <!-- Whether a software navigation bar should be shown. NOTE: in the future this may be
         autodetected from the Configuration. -->
    <bool name="config_showNavigationBar">false</bool>

​ 可以将以上设置为false,不过这里需要注意的是,一般的话这种config 文件都会有overlay文件,所以,请改对应的device下的overlay文件。

​ 另外,上篇文章中也说到了另外一个开关,即谷歌预留的开关,一般的话,系统默认是不会使用的,如果上面改动了,不生效,那就需要看看是不是系统使用了这个 qemu.hw.mainkeys 来控制虚拟按键的显示。

​ 这个prop也给我们提供了一个思路,如果我们需要在代码中隐藏掉虚拟按键,则可以使用这个prop,因为phoneWindowManager中这个prop比读取config_showNavigationBar 要晚一点生效。

不过值得注意的是,这个prop设置了之后,似乎系统只有重启了才会生效。

3. 我是系统开发的,我需要动态的在某些第三方app中显示虚拟按键,而在另外一些第三方app中不需要显示虚拟按键。

说到这个,我们不得不说一个命令:

adb shell settings put global policy_control <key-values>

即也就是settings 命令,里面的 policy_control 属性,它可以实时动态的去选择隐藏或者显示虚拟按键或者状态栏,并且可以选择默认在哪些应用下隐藏,哪些应用下显示。其实这玩意一看单词就清楚了,这不就是我们常说的沉浸式吗?哇哈哈哈

key含义
immersive.full同时隐藏
immersive.status隐藏状态栏
immersive.navigation隐藏导航栏

这些键对应的值可则如下值用逗号组合:

value含义
apps所有应用
*所有界面
packagename指定应用
-packagename排除指定应用

例如:

adb shell settings put global policy_control immersive.full=*

表示设置在所有界面下都同时隐藏状态栏和导航栏。

adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3

表示设置在包名为 com.package1com.package2 的应用里隐藏状态栏,在除了包名为 com.package3 的所有应用里隐藏导航栏。

这里说的都是在adb 里面或者串口里面去调试隐藏。但是如果需要在代码中呢? 那就需要使用

   Settings.Global.putString(context.getContentResolver(), "policy_control", "immersive.navigation=com.package1");

使用这个一定要定要一套规则,否则后面会乱的

4.这里再补充一下

一般我们会在手机中看到,虚拟按键会在某些情况下会过几秒就消失,然后从屏幕下方划出则又会出现。这个具体的实现是在:

frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
 // monitor for system gestures
        mSystemGestures = new SystemGesturesPointerEventListener(context,
                new SystemGesturesPointerEventListener.Callbacks() {
                    @Override
                    public void onSwipeFromTop() {
                        if (mStatusBar != null) {
                           requestTransientBars(mStatusBar);
                        }
                    }
                    @Override
                    public void onSwipeFromBottom() {
                        if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_BOTTOM) {
                                  requestTransientBars(mNavigationBar);
                        }
                    }
                    @Override
                    public void onSwipeFromRight() {
                        if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_RIGHT) {
                            requestTransientBars(mNavigationBar);
                        }
                    }
                    @Override
                    public void onSwipeFromLeft() {
                        if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_LEFT) {
                            requestTransientBars(mNavigationBar);
                        }
                    }

android 系统的全局手势滑动是在phoneWindowManager 中的。即从低下往上滑动时走onSwipeFromBottom(),然后再调用requestTransientBars(mNavigationBar) 来显示虚拟按键的。

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装多好123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值