Android 导航方式切换

简介: Android 导航方式切换

1.导航栏样式目前有,三键导航,也有全局手势导航,具体的设置是在setting里

setting里对应的 代码逻辑在packages\apps\Settings\src\com\android\settings\gestures\SystemNavigationPreferenceController.java

    static boolean isOverlayPackageAvailable(Context context, String overlayPackage) {
        try {
            return context.getPackageManager().getPackageInfo(overlayPackage, 0) != null;
        } catch (PackageManager.NameNotFoundException e) {
            // Not found, just return unavailable
            return false;
        }
    }
 
    static boolean is2ButtonNavigationEnabled(Context context) {
        return NAV_BAR_MODE_2BUTTON == context.getResources().getInteger(
                com.android.internal.R.integer.config_navBarInteractionMode);
    }
 
    static boolean isGestureNavigationEnabled(Context context) {
        return NAV_BAR_MODE_GESTURAL == context.getResources().getInteger(
                com.android.internal.R.integer.config_navBarInteractionMode);
    }


系统默认的导航样式在配置文件中 frameworks\base\core\res\res\values\config.xml


<!-- Controls the navigation bar interaction mode:
         0: 3 button mode (back, home, overview buttons)
         1: 2 button mode (back, home buttons + swipe up for overview)
         2: gestures only for back, home and overview -->
    <integer name="config_navBarInteractionMode">0</integer>


导航方式的切换在packages\apps\Settings\src\com\android\settings\gestures\SystemNavigationGestureSettings.java


    static String getCurrentSystemNavigationMode(Context context) {
        if (SystemNavigationPreferenceController.isGestureNavigationEnabled(context)) {
            return KEY_SYSTEM_NAV_GESTURAL;
        } else if (SystemNavigationPreferenceController.is2ButtonNavigationEnabled(context)) {
            return KEY_SYSTEM_NAV_2BUTTONS;
        } else {
            return KEY_SYSTEM_NAV_3BUTTONS;
        }
    }
 
    @VisibleForTesting
    static void setCurrentSystemNavigationMode(IOverlayManager overlayManager, String key) {
        String overlayPackage = NAV_BAR_MODE_GESTURAL_OVERLAY;
        switch (key) {
            case KEY_SYSTEM_NAV_GESTURAL:
                overlayPackage = NAV_BAR_MODE_GESTURAL_OVERLAY;
                break;
            case KEY_SYSTEM_NAV_2BUTTONS:
                overlayPackage = NAV_BAR_MODE_2BUTTON_OVERLAY;
                break;
            case KEY_SYSTEM_NAV_3BUTTONS:
                overlayPackage = NAV_BAR_MODE_3BUTTON_OVERLAY;
                break;
        }
 
        try {
            overlayManager.setEnabledExclusiveInCategory(overlayPackage, USER_CURRENT);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }


其中导航栏的具体方式定义在

frameworks\base\core\java\android\view\WindowManagerPolicyConstants.java


// Associated overlays for each nav bar mode
    String NAV_BAR_MODE_3BUTTON_OVERLAY = "com.android.internal.systemui.navbar.threebutton";
    String NAV_BAR_MODE_2BUTTON_OVERLAY = "com.android.internal.systemui.navbar.twobutton";
    String NAV_BAR_MODE_GESTURAL_OVERLAY = "com.android.internal.systemui.navbar.gestural";


使用Overlay替换原生导航栏


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.android.internal.systemui.navbar.gestural"
        android:versionCode="1"
        android:versionName="1.0">
    <overlay android:targetPackage="android"
        android:category="com.android.internal.navigation_bar_mode"
        android:priority="1"/>
 
    <application android:label="@string/navigation_bar_mode_title" android:hasCode="false"/>
</manifest>


具体导航栏的逻辑在


目录
相关文章
|
4天前
|
Android开发
【Android 从入门到出门】第四章:现代Android开发中的导航
【Android 从入门到出门】第四章:现代Android开发中的导航
25 2
【Android 从入门到出门】第四章:现代Android开发中的导航
|
4天前
|
Java 定位技术 Android开发
【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)
【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)
86 1
|
4天前
|
XML Java 定位技术
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
135 0
|
存储 Android开发
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(二)
android ViewPager + Fragment + Tablayout 实现嵌套页面导航
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(二)
|
编译器 Android开发 容器
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(一)
android ViewPager + Fragment + Tablayout 实现嵌套页面导航
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(一)
|
Shell API 开发工具
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(2)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(2)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(2)
|
API 开发工具 Android开发
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(1)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(1)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(1)
|
XML Android开发 数据格式
Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)
Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)
330 0
Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)
|
Java Android开发 Kotlin
android网格导航的实现
如今的很多app都在首页有一个可以滑动的导航
306 0
android网格导航的实现
|
Android开发
android Jetpack Navigation组件—— 之嵌套导航图
android Jetpack Navigation组件—— 之嵌套导航图
709 0
android Jetpack Navigation组件—— 之嵌套导航图