我有一個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