已有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及以上版本可通过窗口与屏幕的尺寸比例区分两种模式:
- 获取当前窗口的边界尺寸:
WindowMetrics windowMetrics = getWindowManager().getCurrentWindowMetrics(); Rect windowBounds = windowMetrics.getBounds(); int windowWidth = windowBounds.width(); int windowHeight = windowBounds.height();
- 获取屏幕的实际像素尺寸:
DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); int screenWidth = displayMetrics.widthPixels; int screenHeight = displayMetrics.heightPixels;
- 对比尺寸比例:分屏模式下,窗口的宽度(横向分屏)或高度(纵向分屏)会接近屏幕对应维度的一半(误差通常在系统栏尺寸范围内);自由窗口模式下窗口宽高均不会达到屏幕的一半,且比例不固定:
// 判断是否为横向分屏 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
相关产品推荐
相关产品推荐

