• Android10 手势导航


    种类

    Android10 默认的系统导航有三种:

    1.两个按钮的

    2.三个按钮的

    3.手势

     它们分别对应三个包名

    frameworks/base/packages/overlays/NavigationBarMode2ButtonOverlay
    frameworks/base/packages/overlays/NavigationBarMode3ButtonOverlay

    frameworks/base/packages/overlays/NavigationBarModeGesturalOverlay

    在设置里切换导航模式的时候会执行SystemNavigationGestureSettings.java的如下方法:

    1. static void setCurrentSystemNavigationMode(Context context, IOverlayManager overlayManager,
    2. String key) {
    3. switch (key) {
    4. case KEY_SYSTEM_NAV_GESTURAL:
    5. int sensitivity = getBackSensitivity(context, overlayManager);
    6. setNavBarInteractionMode(overlayManager, BACK_GESTURE_INSET_OVERLAYS[sensitivity]);
    7. break;
    8. case KEY_SYSTEM_NAV_2BUTTONS:
    9. setNavBarInteractionMode(overlayManager, NAV_BAR_MODE_2BUTTON_OVERLAY);
    10. break;
    11. case KEY_SYSTEM_NAV_3BUTTONS:
    12. setNavBarInteractionMode(overlayManager, NAV_BAR_MODE_3BUTTON_OVERLAY);
    13. break;
    14. }
    15. }
    16. private static void setNavBarInteractionMode(IOverlayManager overlayManager,
    17. String overlayPackage) {
    18. try {
    19. overlayManager.setEnabledExclusiveInCategory(overlayPackage, USER_CURRENT);
    20. } catch (RemoteException e) {
    21. throw e.rethrowFromSystemServer();
    22. }
    23. }
    24. -----------------------------------------------------------------------------------
    25. String NAV_BAR_MODE_3BUTTON_OVERLAY = "com.android.internal.systemui.navbar.threebutton";
    26. String NAV_BAR_MODE_2BUTTON_OVERLAY = "com.android.internal.systemui.navbar.twobutton";
    27. String NAV_BAR_MODE_GESTURAL_OVERLAY = "com.android.internal.systemui.navbar.gestural";
    28. -----------------------------------------------------------------------------------

    根据手势加载不同的overlayPackage,也就是上面的三个包名

    配置文件

    这三个包都有对应的配置文件

    config

    这个文件配置了config_navBarInteractionMode,即该模式编号。

    如下是3按钮导航的config.xml文件

    1. <resources>
    2. <integer name="config_navBarInteractionMode">0integer>
    3. resources>

    strings

    就是配置字符串,这个没什么好说的

    dimens

    这里配置了导航栏的宽高之类的,如下是手势导航的dimens.xml

    1. <resources>
    2. <dimen name="navigation_bar_height">16dpdimen>
    3. <dimen name="navigation_bar_height_landscape">16dpdimen>
    4. <dimen name="navigation_bar_width">16dpdimen>
    5. <dimen name="navigation_bar_frame_height">48dpdimen>
    6. <dimen name="navigation_bar_gesture_height">32dpdimen>
    7. resources>

    当你选择了手势导航时,系统就会从这里获取资源。

    如果你想配置三导航的宽高也可以在三导航的 overlayPackage 下添加dimens文件。

    没有在对应的overlayPackage下添加dimens文件的话,系统默认会从frameworks/base/core/res/res/values/dimens.xml中获取,如下:

    1. <dimen name="navigation_bar_height">48dpdimen>
    2. <dimen name="navigation_bar_height_landscape">48dpdimen>
    3. <dimen name="navigation_bar_width">48dpdimen>
    4. <dimen name="navigation_bar_frame_height">@dimen/navigation_bar_heightdimen>
    5. <dimen name="navigation_bar_frame_height_landscape">@dimen/navigation_bar_frame_heightdimen>
    6. <dimen name="navigation_bar_gesture_height">@dimen/navigation_bar_frame_heightdimen>

     BUG

    前提:源码设置的默认导航模式其实是三按钮导航,我的代码设置的默认导航模式是手势导航

    顺带一提,默认系统导航模式在frameworks/base/core/res/res/values/config.xml中设置,如下:

    1. <integer name="config_navBarInteractionMode">0integer>

    遇到过两个bug,一开始是设置大号字体且设置系统导航为三按钮导航后重启。

    这个bug一开始我是将frameworks/base/core/res/res/values/dimens.xml的navigation_bar_height改回48dp(之前改为了16dp),设置大号字体且设置系统导航为三按钮导航后重启,问题完美解决,至少我是这么以为的。

    然后恢复出厂设置第一次开机,默认是手势导航,然后高为48dp(应该为16dp的),导航栏空了一大块,整个人都不好了,然后又把frameworks/base/core/res/res/values/dimens.xml的值改回了16dp,检查了frameworks/base/packages/overlays/NavigationBarModeGesturalOverlay的配置,确实16dp,也没什么问题,但就是不起效,至今原因不明。

    改动了很多值测试都没成功,没办法,又将代码恢复了最初的设置,将48dp改回了16dp,然后百度一下,大神还是很多的。

    终于试了很多种方法后找出了一种有用的

    大神原文:

    【精选】Android 12默认手势导航及bug修复_ro.boot.vendor.overlay.theme_地球边的博客-CSDN博客

    大神分析的原因我没看懂,但是方法确实有效。

    搜索过程中遇到另一篇没看明白的文章,虽然没试过里面的方法,但也贴在这记录一下

    记录修改系统默认导航模式_Only_Studio的博客-CSDN博客

  • 相关阅读:
    Spring Boot + vue-element 开发个人博客项目实战教程(二十一、个人介绍、公告管理、标签管理开发)
    Transformer详解
    蓝牙耳机哪种通话效果最好?通话质量最好的蓝牙耳机盘点
    自动化测试 | Selenium自动化测试框架,实战遇到的坑都在这了,玩转自动化测试
    golang读取键盘功能按键输入
    2023年9月国产数据库大事记-墨天轮
    pandas使用groupby函数基于指定分组变量对dataframe数据进行分组、使用size函数计算分组数据中每个分组样本的个数
    正则表达式[总结]
    Python教程(15)——Python流程控制语句详解
    React 18发布,仅用400行代码就能实现一个Mini-React
  • 原文地址:https://blog.csdn.net/lxjlxj2333/article/details/134414962