簡體   English   中英

拖動移動閃爍 window 的 position

[英]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;
        }
    }
    _ => {}
});

CursorMoved報告

(x,y)相對於 window 左上角的像素坐標。

當您稍后將 position 用於set_outer_position時,您實際上是將窗口相對坐標重新解釋為屏幕相對坐標。

您應該將偏移量應用於從 external_position 返回的position

雖然這解決了眼前的問題,但我不確定它是否足以解釋 window 運動。 當您處理下一個CursorMoved事件時,坐標仍然與窗口相關,但 window 已經移動。 這可能會產生偽影。

更強大的解決方案是在拖動移動操作開始時存儲窗口的 position,並通過累積的增量偏移 position。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM