在 Android 14 R6 系统中修改自由窗口(Freeform)的等比例放大缩小功能,需要从框架层和系统UI两方面入手。以下是关键实现步骤: 1. 窗口管理修改 在 `WindowManagerService` 中修改自由窗口的默认约束条件: ```java // frameworks/base/services/core/java/com/android/server/wm/WindowState.java public void setFreeformScaling(boolean keepRatio) { mAttrs.setFlags( keepRatio ? FLAG_SCALED | FLAG_ASPECT_RATIO_LOCKED : FLAG_SCALED, FLAG_SCALED | FLAG_ASPECT_RATIO_LOCKED); } ``` 2. 添加比例锁定开关 在系统UI中添加比例锁定按钮: ```xml <!-- packages/SystemUI/res/layout/freeform_window_controls.xml --> <ImageButton android:id="@+id/ratio_lock" android:src="@drawable/ic_aspect_ratio_locked" android:contentDescription="@string/lock_aspect_ratio"/> ``` 3. 窗口拖动处理 修改 `TaskPositioner` 以支持比例保持: ```java // frameworks/base/services/core/java/com/android/server/wm/TaskPositioner.java void preserveAspectRatioWhileResizing(Rect bounds) { if (mAspectRatioLocked) { float aspect = mInitialBounds.width() / (float)mInitialBounds.height(); bounds.right = bounds.left + (int)(bounds.height() * aspect); } } ``` 4. 输入事件处理 在 `InputMonitor` 中调整窗口拖动行为: ```java // frameworks/base/services/core/java/com/android/server/wm/InputMonitor.java void handleResizeGesture(boolean keepRatio) { mService.mTaskPositioner.setAspectRatioLocked(keepRatio); } ``` 5. 系统设置入口 添加开发者选项开关: ```java // packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java Preference mFreeformScaling = findPreference("freeform_scaling_mode"); mFreeformScaling.setOnPreferenceChangeListener((pref, value) -> { SystemProperties.set("persist.sys.freeform_scaling", value.toString()); return true; }); ``` 实现注意事项: 1. 需要同步修改 `WindowManagerPolicy` 中的多窗口策略 2. 考虑与现有分屏功能的兼容性问题 3. 不同DPI设备需要单独测试边界条件 三条额外需要注意的逻辑点: - 窗口最小尺寸限制需要与比例锁定功能联动处理 - 旋转屏幕时需要重新计算锁定比例 - 系统重启后应保持用户最后设置的锁定状态 [2025-04-30 11:28:48 | AI写代码神器 | 572点数解答]