You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已有Activity::isInMultiWindowMode,如何区分分屏与自由窗口模式?

区分Android分屏模式与自由窗口模式

要在多窗口场景下区分分屏(Split-Screen)和自由窗口(Freeform)模式,可结合不同Android版本的API实现:

方法1:通过窗口标记判断(Android 8.0+,API 26)

自由窗口模式下,当前Activity的窗口会携带FLAG_FREEFORM标记,分屏模式则无此标记。代码示例:

// 判断是否处于自由窗口模式
boolean isFreeformMode = (getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FREEFORM) != 0;
// 结合多窗口状态,判断是否为分屏模式
boolean isSplitScreenMode = isInMultiWindowMode() && !isFreeformMode;

方法2:通过窗口尺寸比例判断(Android 10+,API 29)

Android 10及以上版本可通过窗口与屏幕的尺寸比例区分两种模式:

  1. 获取当前窗口的边界尺寸:
WindowMetrics windowMetrics = getWindowManager().getCurrentWindowMetrics();
Rect windowBounds = windowMetrics.getBounds();
int windowWidth = windowBounds.width();
int windowHeight = windowBounds.height();
  1. 获取屏幕的实际像素尺寸:
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
int screenWidth = displayMetrics.widthPixels;
int screenHeight = displayMetrics.heightPixels;
  1. 对比尺寸比例:分屏模式下,窗口的宽度(横向分屏)或高度(纵向分屏)会接近屏幕对应维度的一半(误差通常在系统栏尺寸范围内);自由窗口模式下窗口宽高均不会达到屏幕的一半,且比例不固定:
// 判断是否为横向分屏
boolean isHorizontalSplit = Math.abs(windowWidth - screenWidth / 2f) < 100;
// 判断是否为纵向分屏
boolean isVerticalSplit = Math.abs(windowHeight - screenHeight / 2f) < 100;
// 结合多窗口状态区分模式
boolean isSplitScreenMode = isInMultiWindowMode() && (isHorizontalSplit || isVerticalSplit);
boolean isFreeformMode = isInMultiWindowMode() && !isSplitScreenMode;

注意事项

  • 部分定制ROM的多窗口实现可能存在差异,建议在目标设备上测试验证。
  • Android 7.x及以下版本仅支持分屏模式,无需额外区分,直接使用isInMultiWindowMode()即可。

内容的提问来源于stack exchange,提问作者user2649681

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:55:11