DPI大小实际是可以控制平板模式和手机模式,显示较大会自动切换到手机模式。
左为平板模式 右为手机模式
布局差异就在导航栏,任务栏,all app界面上
但现在有个功能上的问题,13.0下做了分屏功能,切换到手机模式下后不支持分屏功能,强制调出来也没有功能launcher还会报错。所以只能对比手机模式的布局在平板模式下去改它的布局使其接近
第一步:android13.0针对平板 把导航栏的实现,从NavigationBar变成了TaskBar,所以存在两个导航栏。手机模式时调用的是SystemUI下NavigationBar。平板模式时调用的是launcher下的TaskBar。所以在平板模式下得先去掉TaskBar导航栏,调出NavigationBar
packages/apps/Launcher3/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java,禁掉isTaskBarEnabled
修改代码路径frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java 以下放出NavigationBar
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
index 5c8d2212..a4d44085 100755
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -94,7 +94,8 @@ public class NavigationBarController implements
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private int mNavMode;
private final BroadcastDispatcher mBroadcastDispatcher;
- @VisibleForTesting boolean mIsTablet;
+ // @VisibleForTesting boolean mIsTablet;
+ @VisibleForTesting boolean mIsTablet = false;
/** A displayId - nav bar maps. */
@VisibleForTesting
@@ -136,7 +137,7 @@ public class NavigationBarController implements
navBarHelper, navigationModeController, sysUiFlagsContainer,
dumpManager, autoHideController, lightBarController, pipOptional,
backAnimation.orElse(null));
- mIsTablet = isTablet(mContext);
+ // mIsTablet = isTablet(mContext);
/*UNISOC:Add for bug 1883604@{*/
mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
if (UnisocPowerManagerUtil.SUPPORT_SUPER_POWER_SAVE && mIsTablet){
@@ -151,7 +152,7 @@ public class NavigationBarController implements
@Override
public void onConfigChanged(Configuration newConfig) {
boolean isOldConfigTablet = mIsTablet;
- mIsTablet = isTablet(mContext);
+ // mIsTablet = isTablet(mContext);
boolean largeScreenChanged = mIsTablet != isOldConfigTablet;
// If we folded/unfolded while in 3 button, show navbar in folded state, hide in unfolded
if (largeScreenChanged && updateNavbarForTaskbar()) {
@@ -273,7 +274,7 @@ public class NavigationBarController implements
@Override
public void onDisplayReady(int displayId) {
Display display = mDisplayManager.getDisplay(displayId);
- mIsTablet = isTablet(mContext);
+ // mIsTablet = isTablet(mContext);
createNavigationBar(display, null /* savedState */, null /* result */);
}
以上是去掉TaskBar导航栏,调出NavigationBar。单独修改Utilities.java也可以调出NavigationBar。这里保险一些怕有别的bug。
第二步:因为在平板模式下调出了NavigationBar导航栏,平板模式的桌面下Hotseat任务栏里的图标依旧在那个位置,就与NavigationBar重叠了。所以得让Hotseat任务栏在平板模式下处于手机模式布局,直接修改判断packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java
这样布局就变成手机模式的样式了,可依旧是重叠状态,我们还得修改Hotseat横竖屏高度
这样桌面布局就和手机模式一致了
第三步:主功能all app界面,手机模式下周围是没有间隙的全部铺满。所以我们也要在平板模式下铺满all app界面packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java
修改allAppsTopPadding顶部边距默认0
修改左右边距
结语:这样整一下,就能在平板模式下达到手机模式的布局且保留了分屏功能,但不是在所有dpi下都可以,此修改只是让平板模式和手机模式一样的显示。但一旦修改显示大小dpi,达到了切换手机模式的数值。它就会变成手机模式没有分屏功能。所以最好是锁定一个dpi。比如dpi230变成手机模式,210还是平板模式,我们就锁定210。