umg 中 拖拽事件和单击事件区分不开了有没有什么办法阻止 拖拽事件 合适的实际再去调用

下午好🌅🌅🌅
本答案参考通义千问
在 Unreal Engine(UE) 的 UMG(User Widget Blueprint) 中,拖拽事件 和 单击事件 有时会互相干扰,尤其是在同一个控件上同时处理这两种事件时。这会导致你无法准确判断用户是“单击”还是“拖拽”,从而引发逻辑错误。
你在 UMG 中为一个按钮或控件添加了 On Drag Started、On Drag Over、On Drop 等拖拽事件,同时也添加了 On Clicked 或 On Mouse Down 等单击事件。当用户进行拖拽操作时,系统可能误判为“单击”,导致逻辑混乱。
On Drag Started),而单击事件通常是在鼠标释放后才触发。要区分“单击”和“拖拽”,可以采用以下方法:
你可以通过一个布尔变量来记录当前是否正在进行拖拽,从而在单击事件中判断是否应忽略该事件。
IsDragging = falseIsDragging = trueIsDragging = falseIsDragging 是否为 false,如果是,则执行单击逻辑;否则,忽略// 在 C++ 中的实现示例
bool UMyWidget::IsDragging = false;
void UMyWidget::OnDragStarted()
{
IsDragging = true;
}
void UMyWidget::OnDragFinished()
{
IsDragging = false;
}
void UMyWidget::OnClicked()
{
if (!IsDragging)
{
// 执行单击逻辑
}
}
如果你希望在拖拽开始后完全阻止单击事件的触发,可以在 On Drag Started 事件中调用 Set IsInteractionEnabled(false) 来暂时禁用控件的交互。
void UMyWidget::OnDragStarted()
{
SetIsInteractionEnabled(false);
}
void UMyWidget::OnDragFinished()
{
SetIsInteractionEnabled(true);
}
你可以将单击和拖拽事件统一交给一个自定义事件处理函数,根据时间差或距离判断是单击还是拖拽。
MouseDownTime)MouseDownPosition)FVector2D LastMousePosition;
void UMyWidget::OnMouseButtonDown(FGeometry MyGeometry, const FPointerEvent& MouseEvent)
{
LastMousePosition = MouseEvent.GetCursorPos();
MouseDownTime = GetWorld()->GetTimeSeconds();
}
void UMyWidget::OnMouseMove(FGeometry MyGeometry, const FPointerEvent& MouseEvent)
{
FVector2D CurrentMousePosition = MouseEvent.GetCursorPos();
float Distance = (CurrentMousePosition - LastMousePosition).Size();
if (Distance > 5.0f)
{
// 触发拖拽逻辑
OnDragStarted();
}
}
void UMyWidget::OnMouseButtonUp(FGeometry MyGeometry, const FPointerEvent& MouseEvent)
{
float TimeElapsed = GetWorld()->GetTimeSeconds() - MouseDownTime;
if (TimeElapsed < 0.3f && (CurrentMousePosition - LastMousePosition).Size() < 5.0f)
{
// 单击逻辑
OnClicked();
}
}
Set IsHovered 和 Set IsPressed 控制事件触发顺序你可以手动控制控件的 悬停 和 按下 状态,以确保拖拽事件优先于单击事件被触发。
重点解决方式如下:
IsDragging)来区分拖拽和单击OnMouseButtonDown, OnMouseMove, OnMouseButtonUp 中实现精细控制。如有需要,我可以提供完整的 UMG 蓝图示例 或 C++ 代码片段,帮助你快速实现这个功能。欢迎继续提问!