我有一个BrowserWindow的实例。我想知道窗口在屏幕上被拖动/移动的时间。如何跟踪电子中BrowserWindow的拖动?
我已经尝试使用移动的事件,但该事件只在窗口移动后被触发。当窗口被拖动时它不会被触发。
如何跟踪窗口被拖动的时间?
我有一个BrowserWindow的实例。我想知道窗口在屏幕上被拖动/移动的时间。如何跟踪电子中BrowserWindow的拖动?
我已经尝试使用移动的事件,但该事件只在窗口移动后被触发。当窗口被拖动时它不会被触发。
如何跟踪窗口被拖动的时间?
我有同样的问题,我解决它以另一种方式。 我创建了一个无框浏览器窗口,我用我想要的图标和我希望在该窗口中加载的网页中所需的监听器制作了我的“系统栏”。
这工作正常,并不昂贵。
let wX;
let wY;
let dragging = false;
$('#systembar').mousedown(function (e) {
ipcRenderer.send('asynchronous-message', 'down')
dragging = true;
wX = e.pageX;
wY = e.pageY;
});
$(window).mousemove(function (e) {
e.stopPropagation();
e.preventDefault();
if (dragging) {
var xLoc = e.screenX - wX;
var yLoc = e.screenY - wY;
try {
remote.BrowserWindow.getFocusedWindow().setPosition(xLoc, yLoc);
} catch (err) {
console.log(err);
}
}
});
$('#systembar').mouseup(function() {
dragging = false;
ipcRenderer.send('asynchronous-message', 'up')
});
Electron API在拖动过程中似乎不提供实际窗口位置的跟踪。
但是,不是试图跟踪窗口本身的新位置,而是可以在可拖动窗口区域中的mousedown过程中跟踪鼠标光标的移动。
代码大纲:
mousemove
事件你可以不断地运行一个循环内拖动事件检查window.screenX
或window.screenY
值是否已更改。沿着下面的内容:
function onScreenMove(cb) {
var lastScreenX;
var lastScreenY;
function detectScreenMove() {
if (lastScreenY !== window.screenY || lastScreenX !== window.screenX) {
lastScreenY = window.screenY;
lastScreenX = window.screenX;
cb();
}
requestAnimationFrame(detectScreenMove);
}
requestAnimationFrame(detectScreenMove);
}
onScreenMove(function() {
// do something
});
据我所知,读取screenX
/screenY
值的过程也不是很昂贵的,所以你不会杀处理器。
不幸的是,Object.observe()
从v50版本开始就已经离开Chrome了,所以看起来似乎没有更多检查window
属性更改的“底层”方法。
解决方案的工作在理论,但它可能最终会被相当昂贵,不断有运行 – RainSear
每当窗口移动一个像素时,就会发出move
(和moved
)事件BrowserWindow
。如果窗口被拖动并移动,则不断触发事件move
,直到鼠标停止。
当move
检测就可以得到该窗口的位置
let position = window.GetPosition();
let x = position[0];
let y = position[1];
然后使用这些职位的要求
也许,循环可在其他平台,但在Mac的情况下'move' /'moved'事件,仅启动后该窗口已拖动_stopped_。 – RainSear
我错过了关于如何在Mac上的提示'move'只是'moved'的一个别名。 – DavidTheWin
这是迄今为止最优化的解决方案 – RainSear