enableEdgeDocking static method
Future<bool>
enableEdgeDocking({
- required WindowEdge edge,
- double visibleWidth = 5.0,
- int hoverDelay = 300,
启用窗口边缘停靠功能(类似QQ的停靠行为)
edge 要停靠到的边缘位置
visibleWidth 停靠时可见的窗口宽度(像素),默认为5像素
hoverDelay 鼠标悬停多久后显示窗口(毫秒),默认300毫秒
返回 true 表示启用成功,false 表示启用失败
此功能会:
- 将窗口移动到指定边缘,大部分隐藏,只留小部分可见
- 监听鼠标位置,当鼠标悬停在可见部分时显示完整窗口
- 当鼠标离开窗口区域时,重新隐藏到边缘
Implementation
static Future<bool> enableEdgeDocking({
required WindowEdge edge,
double visibleWidth = 5.0,
int hoverDelay = 300,
}) async {
if (!MyPlatform.isDesktop) return false;
try {
final display = await screenRetriever.getPrimaryDisplay();
if (display.visiblePosition == null || display.visibleSize == null) {
return false;
}
final windowSize = await windowManager.getSize();
final workArea = display.visibleSize!;
final workAreaPosition = display.visiblePosition!;
// 计算停靠位置
Offset dockPosition;
switch (edge) {
case WindowEdge.left:
dockPosition = Offset(
workAreaPosition.dx - windowSize.width + visibleWidth,
workAreaPosition.dy + (workArea.height - windowSize.height) / 2,
);
break;
case WindowEdge.right:
dockPosition = Offset(
workAreaPosition.dx + workArea.width - visibleWidth,
workAreaPosition.dy + (workArea.height - windowSize.height) / 2,
);
break;
case WindowEdge.top:
dockPosition = Offset(
workAreaPosition.dx + (workArea.width - windowSize.width) / 2,
workAreaPosition.dy - windowSize.height + visibleWidth,
);
break;
case WindowEdge.bottom:
dockPosition = Offset(
workAreaPosition.dx + (workArea.width - windowSize.width) / 2,
workAreaPosition.dy + workArea.height - visibleWidth,
);
break;
}
// 移动窗口到停靠位置
await windowManager.setPosition(dockPosition);
// 启动鼠标位置监听
_startMousePositionMonitoring(
edge: edge,
dockPosition: dockPosition,
windowSize: windowSize,
visibleWidth: visibleWidth,
hoverDelay: hoverDelay,
workAreaPosition: workAreaPosition,
workArea: workArea,
);
return true;
} catch (e) {
XlyLogger.error('启用边缘停靠失败', e);
return false;
}
}