前言:
平行视界是谷歌为了解决大屏横屏设备 适配为手机等竖屏设备开发的APP , 在这类APP显示时 在横屏设备上不方便用户观看。
android 13 上平行视界的效果如下:
正文:
在android13前 ,各家有各自的解决方案,下面提供一种实现方案,如下:
frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
-
// ---------#--------------#-----------
-
// | # # |
-
// | # # |
-
// | # # |
-
// | # # | 如果 显示器是横屏, app 是竖屏 , 则将显示的宽高 等比例缩放
-
// | # # |
-
// | # # |
-
// ---------#--------------#-----------
private DisplayInfo updateDisplayAndOrientation(int uiMode, Configuration outConfig) {
// Use the effective "visual" dimensions based on current rotation
final int rotation = getRotation();
final boolean rotated = (rotation == ROTATION_90 || rotation == ROTATION_270);
-
final int dw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
-
final int dh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
+// 如果 显示器是横屏, app 是竖屏 , 则将显示的宽高 等比例缩放
+// final int dw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
+// final int dh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
-
int dw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
-
int dh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
-
if( SystemProperties.getBoolean("persist.sys.landspace.display.portrait.app.enabled", false) ) {
-
int appOrientation = getOrientation();
-
if( rotated && appOrientation==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ){
-
dw = mBaseDisplayWidth*mBaseDisplayWidth/mBaseDisplayHeight;
-
dh = mBaseDisplayWidth;
-
Slog.d(TAG, "修改显示大小 dw "+dw +" dh "+dh );
-
}
-
}
// Update application display metrics.
final WmDisplayCutout wmDisplayCutout = calculateDisplayCutoutForRotation(rotation);
final DisplayCutout displayCutout = wmDisplayCutout.getDisplayCutout();
@@ -4015,6 +4035,17 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
int height = displayInfo.logicalHeight;
int top = (physHeight - height) / 2;
out.set(left, top, left + width, top + height);
+// 在display 是横屏, app 是竖屏时 计算 window 的边框
-
if( SystemProperties.getBoolean("persist.sys.landspace.display.portrait.app.enabled", false) ) {
-
int appOrientation = getOrientation();
-
if( rotated && appOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ){
-
int appWidth = mBaseDisplayWidth*mBaseDisplayWidth/mBaseDisplayHeight;
-
int appHeight = mBaseDisplayWidth;
-
out.set(0, 0, appWidth, appHeight);
-
Slog.d(TAG, "计算window Bounds "+out);
-
}
-
}
}
frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -1191,6 +1213,14 @@ public class DisplayRotation {
if (isAnyPortrait(preferredRotation)) {
return preferredRotation;
}
+// app 请求竖屏 ,display 修改返回横屏
-
if( SystemProperties.getBoolean("persist.sys.landspace.display.portrait.app.enabled", false) ) {
-
if( sensorRotation == Surface.ROTATION_90 ){
-
return mLandscapeRotation;
-
}else if( sensorRotation == Surface.ROTATION_270){
-
return mSeascapeRotation;
-
}
-
}
return mPortraitRotation;
case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE: