Захват событий
События захвата сообщают вам об изменениях состояния захвата мыши. В UI Toolkit есть два типа событий захвата:
- События захвата мыши
- События захвата указателя
Когда элемент захватывает мышь или указатель, это единственный элемент, который получает события от указательного устройства до тех пор, пока устройство не освободится или не потеряет захват.
Например, если вы нажимаете в текстовом поле, текстовое поле захватывает мышь. Мышь все еще может перемещаться по экрану, но она не будет вызывать события вне текстового поля. Пока текстовое поле захватывает вашу мышь, оно не будет вызывать другие события. Когда пользователь нажимает кнопку на мыши вне текстового поля, поле освобождает свой захват мыши.
В нижеследующей таблице описываются события улавливания и этапы их распространения:
| Мероприятие | Описание | Просыпается | Пузырьки вверх | Аннулируемые |
|---|---|---|---|---|
| MouseCaptureEvent | Отправляется, когда элемент захватывает мышь. | Да | Да | Нет |
| MouseCaptureOutEvent | Отправляется, когда элемент освобождается или иным образом теряет захват мыши. | Да | Да | Нет |
| PointerCaptureEvent | Отправляется, когда элемент захватывает указатель. | Да | Да | Нет |
| PointerCaptureOutEvent | Отправляется, когда элемент освобождает указатель. | Да | Да | Нет |
Поведение
Поимка мышей
События захвата мыши относятся к физической мыши или к виртуальной мыши, эмулирующей физическую. Захват мыши также приводит к PointerCaptureEvent для указателя мыши.
Когда элемент освобождает захват мыши, соответствующий триггер MouseCaptureOutEvent, с целью элемента, который запросил освобождение захвата мыши.
Никогда не может быть двух элементов, которые захватывают мышь одновременно. Если другой визуальный элемент вызывает MouseCaptureEvent, элемент, который отправил первоначальный MouseCaptureEvent теряет захват. Это также вызывает MouseCaptureOutEvent на первоначальном элементе.
Захват указателя
События указателя предшествуют событиям мыши в UI Toolkit. Если тип указателя — мышь, захват указателя также вызывает соответствующие события захватов мыши. Захват указателя также вызывает захват мыши.
Список событий
MouseCaptureEvent
Событие MouseCaptureEvent отправляется, когда элемент захватывает мышь.
target: Элемент, который выполняет захват.
MouseCaptureOutEvent
Событие MouseCaptureOutEvent отправляется, когда элемент освобождается или теряет захват мыши.
target: Элемент, который теряет захват.
PointerCaptureEvent
Событие PointerCaptureEvent отправляется, когда элемент захватывает указатель.
target: Элемент, который выполняет захват.
PointerCaptureOutEvent
Событие PointerCaptureOutEvent отправляется, когда элемент освобождается или теряет захват указателя.
target: Элемент, который теряет захват.
Примеры
Следующий пример демонстрирует поведение событий захвата, а также захвата и освобождения указателей.
Чтобы посмотреть пример в действии, выполните следующие действия:
- В Assets > Скрипты > Редакторсоздайте новый файл C# с именем CaptureEventsTestWindow.cs
- Скопируйте пример в скрипт C#.
- На панели редактора выберите Окно > UI Toolkit > Тестовое окно "Запись событий".
- Щелкните по различным меткам в диалоговом окне и наблюдайте за выходными данными консоли.
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");
});
}
}