Android 12默认手势导航方法有2种
第1种方法:配置如下ro即可
ro.boot.vendor.overlay.theme=com.android.internal.systemui.navbar.gestural
第2种方法:在SettingsProvider.java中直接调用切换
if (currentVersion == 191) {
final SettingsState secureSettings = getSecureSettingsLocked(userId);
int mode = getContext().getResources().getInteger(
com.android.internal.R.integer.config_navBarInteractionMode);
if (mode == NAV_BAR_MODE_GESTURAL) {
switchToDefaultGestureNavBackInset(userId, secureSettings);
}
// add by songhui for default navbar mode for gestural
if (SystemProperties.get("ro.xxx_navbarmode_gestural").equals("1")) {
switchToDefaultGestureNavBackInset(userId, secureSettings);
}
// add by songhui for default navbar mode for gestural
migrateBackGestureSensitivity(Secure.BACK_GESTURE_INSET_SCALE_LEFT, userId,
secureSettings);
migrateBackGestureSensitivity(Secure.BACK_GESTURE_INSET_SCALE_RIGHT, userId,
secureSettings);
currentVersion = 192;
}
或许有人会通过配置framework的overlay或者配置gestural rro isStatic="true"标签修改
但是这种方式会有其他bug,比如有些应用会出现导航栏重叠现象,例如微信
会出现的bug
MTK平台Android 12如果切换到手势导航以后,重启手机会出现导航栏高度还是3按键的高度
这是因为DisplayPolicy起的太早了,没有加载gestural rro apk,5秒以后,overlay才加载,导致mNavBarOpacityMode一直为0,需要后面再刷一下policy
修改方法
frameworks/base/services/java/com/android/server/SystemServer.java
+ mActivityManagerService.updateSystemUiContext();
if (SystemProperties.getInt("persist.sys.displayinset.top", 0) > 0) {
// DisplayManager needs the overlay immediately.
+ // mActivityManagerService.updateSystemUiContext();
LocalServices.getService(DisplayManagerInternal.class).onOverlayChanged();
}
切换手势导航后,手势的导航栏高度不更新
LauncherMi / quickstep/src/com/android/quickstep/RotationTouchHelper.java
if ((flags & CHANGE_NAVIGATION_MODE) != 0) {
NavigationMode newMode = info.navigationMode;
mOrientationTouchTransformer.setNavigationMode(newMode, mDisplayController.getInfo(),
mContext.getResources());
/* yft songhui modify for bug @{ */
int newGesturalHeight = ResourceUtils.getNavbarSize(
ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE,
mContext.getResources());
setGesturalHeight(newGesturalHeight);
/* @} */
if (forceRegister || (!mMode.hasGestures && newMode.hasGestures)) {
setupOrientationSwipeHandler();
} else if (mMode.hasGestures && !newMode.hasGestures) {
destroyOrientationSwipeHandlerCallback();
}