enableCornerDocking static method
Future<bool>
enableCornerDocking({
- required WindowCorner corner,
- double visibleSize = 20.0,
- int hoverDelay = 300,
启用角落停靠功能(类似QQ的角落停靠行为)
corner 要停靠到的角落位置
visibleSize 停靠时可见的窗口尺寸(像素),默认为20x20像素
hoverDelay 鼠标悬停多久后显示窗口(毫秒),默认300毫秒
返回 true 表示启用成功,false 表示启用失败
此功能会:
- 将窗口移动到指定角落,大部分隐藏,只留小部分可见
- 监听鼠标位置,当鼠标悬停在可见部分时显示完整窗口
- 当鼠标离开窗口区域时,重新隐藏到角落
Implementation
static Future<bool> enableCornerDocking({
required WindowCorner corner,
double visibleSize = 20.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!;
// 计算停靠位置(角落位置,大部分隐藏)
// 角落停靠时露出一个L形区域,比正方形更容易找到
final cornerVisibleWidth = visibleSize * 2; // 水平方向可见宽度
final cornerVisibleHeight = visibleSize; // 垂直方向可见高度
Offset dockPosition;
switch (corner) {
case WindowCorner.topLeft:
dockPosition = Offset(
workAreaPosition.dx - windowSize.width + cornerVisibleWidth,
workAreaPosition.dy - windowSize.height + cornerVisibleHeight,
);
break;
case WindowCorner.topRight:
dockPosition = Offset(
workAreaPosition.dx + workArea.width - cornerVisibleWidth,
workAreaPosition.dy - windowSize.height + cornerVisibleHeight,
);
break;
case WindowCorner.bottomLeft:
dockPosition = Offset(
workAreaPosition.dx - windowSize.width + cornerVisibleWidth,
workAreaPosition.dy + workArea.height - cornerVisibleHeight,
);
break;
case WindowCorner.bottomRight:
dockPosition = Offset(
workAreaPosition.dx + workArea.width - cornerVisibleWidth,
workAreaPosition.dy + workArea.height - cornerVisibleHeight,
);
break;
}
// 移动窗口到停靠位置
await windowManager.setPosition(dockPosition);
// 启动鼠标位置监听
_startCornerMousePositionMonitoring(
corner: corner,
dockPosition: dockPosition,
windowSize: windowSize,
visibleSize: visibleSize,
hoverDelay: hoverDelay,
workAreaPosition: workAreaPosition,
workArea: workArea,
);
return true;
} catch (e) {
XlyLogger.error('启用角落停靠失败', e);
return false;
}
}