当前位置:   article > 正文

Android 导航方式切换

Android 导航方式切换

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

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

  1. static boolean isOverlayPackageAvailable(Context context, String overlayPackage) {
  2. try {
  3. return context.getPackageManager().getPackageInfo(overlayPackage, 0) != null;
  4. } catch (PackageManager.NameNotFoundException e) {
  5. // Not found, just return unavailable
  6. return false;
  7. }
  8. }
  9. static boolean is2ButtonNavigationEnabled(Context context) {
  10. return NAV_BAR_MODE_2BUTTON == context.getResources().getInteger(
  11. com.android.internal.R.integer.config_navBarInteractionMode);
  12. }
  13. static boolean isGestureNavigationEnabled(Context context) {
  14. return NAV_BAR_MODE_GESTURAL == context.getResources().getInteger(
  15. com.android.internal.R.integer.config_navBarInteractionMode);
  16. }

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

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

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

  1. static String getCurrentSystemNavigationMode(Context context) {
  2. if (SystemNavigationPreferenceController.isGestureNavigationEnabled(context)) {
  3. return KEY_SYSTEM_NAV_GESTURAL;
  4. } else if (SystemNavigationPreferenceController.is2ButtonNavigationEnabled(context)) {
  5. return KEY_SYSTEM_NAV_2BUTTONS;
  6. } else {
  7. return KEY_SYSTEM_NAV_3BUTTONS;
  8. }
  9. }
  10. @VisibleForTesting
  11. static void setCurrentSystemNavigationMode(IOverlayManager overlayManager, String key) {
  12. String overlayPackage = NAV_BAR_MODE_GESTURAL_OVERLAY;
  13. switch (key) {
  14. case KEY_SYSTEM_NAV_GESTURAL:
  15. overlayPackage = NAV_BAR_MODE_GESTURAL_OVERLAY;
  16. break;
  17. case KEY_SYSTEM_NAV_2BUTTONS:
  18. overlayPackage = NAV_BAR_MODE_2BUTTON_OVERLAY;
  19. break;
  20. case KEY_SYSTEM_NAV_3BUTTONS:
  21. overlayPackage = NAV_BAR_MODE_3BUTTON_OVERLAY;
  22. break;
  23. }
  24. try {
  25. overlayManager.setEnabledExclusiveInCategory(overlayPackage, USER_CURRENT);
  26. } catch (RemoteException e) {
  27. throw e.rethrowFromSystemServer();
  28. }
  29. }

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

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

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

使用Overlay替换原生导航栏

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

具体导航栏的逻辑在

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/315396
推荐阅读
相关标签
  

闽ICP备14008679号