События захвата информируют вас об изменениях в состоянии захвата мыши. UI(пользовательский интерфейс) Позволяет пользователю взаимодействовать с вашим приложением. Подробнее
См. в Словарь В Toolkit предусмотрено два типа захвата событий:
- События захвата мыши
- События захвата указателя
Когда элемент захватывает мышь или указатель, это единственный элемент, который получает события от указывающего устройства до тех пор, пока устройство не отпустит или не потеряет захват.
Например, если щелкнуть текстовое поле, текстовое поле захватит мышь. Мышь по-прежнему может перемещаться по экрану, но она не будет запускать события за пределами текстового поля. Пока текстовое поле захвачено вашей мышью, оно не будет запускать другие события. Когда пользователь нажимает кнопку мыши за пределами текстового поля, поле освобождает захват мыши.
Событие | Описание | Стекает вниз | Пузыри вверх | Отменяемый |
---|---|---|---|---|
MouseCaptureEvent | Отправляется, когда элемент захватывает мышь. | ✔ | ✔ | |
MouseCaptureOutEvent | Отправляется, когда элемент освобождается или иным образом теряет захват мыши. | ✔ | ✔ | |
PointerCaptureEvent | Отправляется, когда элемент захватывает указатель. | ✔ | ✔ | |
PointerCaptureOutEvent | Отправляется, когда элемент освобождает указатель. | ✔ | ✔ |
Поведение
Захват мыши
События захвата мыши относятся к событиям физической мыши или виртуальной мыши, эмулирующей физическую мышь. Захват мыши также приведет к PointerCaptureEvent
для указателя мыши.
Когда элемент освобождает захват мыши, срабатывает соответствующее событие MouseCaptureOutEvent
, целью которого является элемент, запросивший освобождение захвата.
Не может быть двух элементов, которые захватывают мышь одновременно. Если другой визуальный элемент инициирует MouseCaptureEvent
, элемент, отправивший исходное MouseCaptureEvent
, теряет захват. Это также вызывает событие MouseCaptureOutEvent
для исходного элемента.
Захват указателя
События указателя предшествуют событиям мыши в UI Toolkit. Если тип указателя — мышь, его захват также вызовет соответствующие события захвата мыши. Захват указателя также захватит мышь.
Список событий
Событие захвата мыши
Событие MouseCaptureEvent
отправляется, когда элемент захватывает мышь.
target
: элемент, который получает захват.
MouseCaptureOutEvent
Событие MouseCaptureOutEvent
отправляется, когда элемент освобождается или теряет захват мыши.
target
: элемент, который теряет захват.
Событие PointerCapture
Событие PointerCaptureEvent
отправляется, когда элемент захватывает указатель.
target
: элемент, который получает захват.
Событие PointerCaptureOut
Событие PointerCaptureOutEvent
отправляется, когда элемент освобождается или теряет захват указателя.
target
: элемент, который теряет захват.
Примеры
В следующем примере демонстрируется поведение событий захвата, а также захват и освобождение указателей.
Чтобы увидеть пример в действии, сделайте следующее:
- В разделе Ресурсы > Сценарии > Редактор создайте новый файл C# с именем CaptureEventsTestWindow.cs
- Скопируйте пример в сценарий C#.
- На панели инструментов редактора выберите Окно > Набор инструментов пользовательского интерфейса > Тестовое окно захвата событий.
- Нажимайте различные метки в диалоговом окне и наблюдайте за выводом в консоли.
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();
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((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((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((evt) =>
{
Debug.Log("Mouse captured");
});
rootVisualElement.RegisterCallback((evt) =>
{
Debug.Log("Mouse captured released");
});
}
}