[英]Drag move flickers position of window
我正在實現 Rust 替代 .NET 的DragMove方法,但是結果導致應用程序在兩個相對位置之間閃爍。
我用來執行拖動移動的代碼:
let mut mouse_down = false;
let mut last_pos: Option<PhysicalPosition<f64>> = None;
event_loop.run(move |event, _, control_flow| match event {
Event::WindowEvent {
event: WindowEvent::CursorMoved {
position,
..
},
..
} => {
let gl_window = display.gl_window();
let window = gl_window.window();
if mouse_down {
if last_pos.is_some() {
let previous_pos = last_pos.unwrap();
let delta_x = previous_pos.x - position.x;
let delta_y = previous_pos.y - position.y;
window.set_outer_position(PhysicalPosition::new(position.x + delta_x, position.y + delta_y));
}
last_pos = Some(position);
}
}
Event::WindowEvent {
event: WindowEvent::MouseInput{
state,
button,
..
},
..
} => {
mouse_down = button == MouseButton::Left && state == ElementState::Pressed;
if !mouse_down {
last_pos = None;
}
}
_ => {}
});
(x,y)相對於 window 左上角的像素坐標。
當您稍后將 position 用於set_outer_position
時,您實際上是將窗口相對坐標重新解釋為屏幕相對坐標。
您應該將偏移量應用於從 external_position 返回的position 。
雖然這解決了眼前的問題,但我不確定它是否足以解釋 window 運動。 當您處理下一個CursorMoved
事件時,坐標仍然與窗口相關,但 window 已經移動。 這可能會產生偽影。
更強大的解決方案是在拖動移動操作開始時存儲窗口的 position,並通過累積的增量偏移 position。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.