捕获事件会通知您鼠标捕获状态的变化。 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表 工具包有两种类型的捕获事件
当某个元素捕获鼠标或指针时,它是唯一接收来自指向设备的事件的元素,直到设备释放或丢失捕获。
例如,如果您点击文本框,则文本框会捕获鼠标。鼠标仍然可以在屏幕上移动,但它不会触发文本框外部的事件。只要文本框捕获了您的鼠标,它就不会触发其他事件。当用户按下文本框外部的鼠标上的按钮时,该框会释放其鼠标捕获。
事件 | 描述 | 向下传递 | 向上冒泡 | 可取消 |
---|---|---|---|---|
MouseCaptureEvent | 当元素获取鼠标捕获时发送。 | ✔ | ✔ | |
MouseCaptureOutEvent | 当元素释放或以其他方式丢失鼠标捕获时发送。 | ✔ | ✔ | |
PointerCaptureEvent | 当元素捕获指针时发送。 | ✔ | ✔ | |
PointerCaptureOutEvent | 当元素释放指针时发送。 | ✔ | ✔ |
鼠标捕获事件是指物理鼠标或模拟物理鼠标的虚拟鼠标上的事件。捕获鼠标也会导致鼠标指针的PointerCaptureEvent
。
当某个元素释放鼠标捕获时,相应的MouseCaptureOutEvent
会触发,目标是请求释放捕获的元素。
永远不可能有两个元素同时捕获鼠标。如果另一个视觉元素视觉树的一个节点,它实例化或派生自 C# VisualElement
类。您可以设置外观样式,定义行为,并将其显示在屏幕上作为 UI 的一部分。 更多信息
参见 术语表触发MouseCaptureEvent
,则发送原始MouseCaptureEvent
的元素将丢失捕获。这也会在原始元素上触发MouseCaptureOutEvent
。
在 UI 工具包中,指针事件优先于鼠标事件。如果指针类型是鼠标,则捕获它也会触发相应的鼠标捕获事件。捕获指针也会捕获鼠标。
当元素获取鼠标捕获时,会发送MouseCaptureEvent
事件。
target
:获取捕获的元素。
当元素释放或丢失鼠标捕获时,会发送MouseCaptureOutEvent
事件。
target
:丢失捕获的元素。
当元素获取指针捕获时,会发送PointerCaptureEvent
事件。
target
:获取捕获的元素。
当元素释放或丢失指针捕获时,会发送PointerCaptureOutEvent
事件。
target
:丢失捕获的元素。
以下示例演示了捕获事件的行为以及捕获和释放指针。
要查看示例的实际效果,请执行以下操作
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class CaptureEventsTestWindow : EditorWindow
{
[MenuItem("Window/UI Toolkit/Capture Events Test Window")]
public static void ShowExample()
{
var wnd = GetWindow<CaptureEventsTestWindow>();
wnd.titleContent = new GUIContent("Capture Events Test Window");
}
private bool m_IsCapturing = false;
public void CreateGUI()
{
// Add a few clickable labels that print a message to the console when clicked
for (int i = 0; i < 4; i++)
{
Label clickableLabel = new Label($"Label {i} - Click Me!");
clickableLabel.RegisterCallback<MouseDownEvent>((evt) => { Debug.Log($"Clicked on label '{(evt.target as Label).text}'"); });
rootVisualElement.Add(clickableLabel);
}
// Now add a label that captures the pointer
Label capturingLabel = new Label("Click here to capture mouse");
capturingLabel.RegisterCallback<MouseDownEvent>((evt) =>
{
if (!m_IsCapturing)
{
capturingLabel.text = "Click here to release mouse";
MouseCaptureController.CaptureMouse(capturingLabel);
m_IsCapturing = true;
}
else
{
capturingLabel.text = "Click here to capture mouse";
MouseCaptureController.ReleaseMouse(capturingLabel);
m_IsCapturing = false;
}
});
rootVisualElement.Add(capturingLabel);
// Register callbacks to print a message when the mouse is captured or released
rootVisualElement.RegisterCallback<MouseCaptureEvent>((evt) =>
{
Debug.Log("Mouse captured");
});
rootVisualElement.RegisterCallback<MouseCaptureOutEvent>((evt) =>
{
Debug.Log("Mouse captured released");
});
}
}