[英]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.