Version: 6000.3
语言: 中文
小组活动
工具提示事件

指针事件

指针事件会针对与指点设备的 UI 交互而触发。与鼠标事件类似,指针事件提供有关所用输入设备的附加信息,例如笔压或倾斜角度。

在 UI 工具包中,指针事件始终位于鼠标事件之前。

指针事件没有持久位置。当它们从触摸设备中释放时,它们也没有设定的位置。

一些指针事件,例如PointerStationaryEventPointerCancelEvent事件,具有由输入设备的作系统 (OS) 触发的条件。

所有指针事件的基类都是 PointerEventBase

事件 描述 涓涓细流 气泡升起 可取消
PointerDown事件 按下指针时发送。 是的 是的 是的
PointerUp事件 释放指针时发送。 是的 是的 是的
指针移动事件 当指针更改状态时发送。 是的 是的 是的
指针输入事件 当指针输入视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表
,或其后代之一。
是的 是的
指针离开事件 当指针离开视觉元素及其所有后代时发送。 是的 是的
PointerOverEvent 当指针进入视觉元素时发送。 是的 是的 是的
PointerOutEvent 当指针离开视觉元素时发送。 是的 是的 是的
PointerStationary事件 当指针类型(如触控笔或手指)在作系统确定的设定时间内未更改时发送。 是的 是的 是的
指针取消事件 当作系统取消指针作时发送。 是的 是的 是的

独特的属性

altitudeAngle:altitudeAngle 包含画笔相对于表面的角度(以弧度为单位)。值为 0 表示画笔平行于表面。值 pi/2 表示它垂直于表面。

azimuthAngle:azimuthAngle 包含画笔相对于 x 轴的角度,以弧度为单位。值为 0 表示触控笔指向设备的 x 轴。

button:button 属性返回一个整数,用于标识按下以触发事件的鼠标按钮。下表列出了整数和关联的鼠标按钮:

整数 按钮
0 左键
1 右键
2 中间按钮

clickCount:clickCount 属性包含按下按钮的次数。

deltaPosition:这deltaPosition属性包含指针在上一个鼠标事件期间的位置与当前鼠标事件期间指针位置之间的差值。

deltaTime:这deltaTime属性包含自上次记录指针值更改以来经过的时间量(以秒为单位)。

localPosition:这localPosition属性返回相对于目标视觉元素的指针位置。

modifiers:modifiers 属性返回当前按住的修饰键。修饰符的一些示例是Shift,CtrlAlt钥匙。有关更多信息,请参阅 MDN 文档的修饰键部分

pointerId:pointerId 属性返回一个整数,用于标识发送事件的指针。

pointerType:pointerType 属性返回一个字符串,该字符串定义创建事件的指针类型。

position:position 属性返回屏幕或世界坐标系中的指针位置。

pressedButtons:pressedButton 属性返回一个整数,用于标识当前按下的鼠标按钮组合。

该数字是各个按钮的整数值之和(见下表)。例如,同时按住鼠标右键和鼠标中键将导致 pressedButton 的值为 6。

整数 按钮
1 左键
2 右键
4 中间按钮

pressure:压力属性返回触摸当前施加的压力量。如果设备未报告压力,则此属性的值为 1.0f。

radius:radius 属性返回触摸半径的估计值。添加 radiusVariance 以获得最大触摸半径,减去它以获得最小触摸半径。

radiusVariance:radiusVariance 属性值确定触摸半径的精度。将此值添加到半径中以获得最大触摸半径,减去该值以获得最小触摸半径。

tangentialPressure:tangentialPressure 属性返回一个浮点值,表示施加到画笔上其他压敏控件的压力。

twist:twist 属性返回画笔绕其轴的旋转(以弧度为单位)。

活动列表

以下列表提供了事件系列中每个事件的名称、描述和目标。有关事件的详细信息,请参阅 UI 工具包 API

PointerDown事件

在视觉元素中按下指针时,将发送 PointerDownEvent

target:接收指针捕获的视觉元素。否则,它是光标下最顶层的可选择元素。

PointerUp事件

当您在视觉元素中释放指针时,将触发 PointerUpEvent

PointerUpEvent事件触发器时,它还会删除指针坐标。它还会清除指针的缓存,因此没有指针位置的记录。

target:接收指针捕获的视觉元素。否则,它是光标下最顶层的可选择元素。

指针移动事件

当指针更改状态时,将发生 PointerMoveEvent

target:接收指针捕获的视觉元素。否则,它是光标下最顶层的可选择元素。

指针输入事件

当指针进入可视元素或其后代之一时,将发送 PointerEnterEvent

target:指针退出的视觉元素(或其后代之一)。

指针离开事件

当指针离开可视元素及其所有后代时,将发送 PointerLeaveEvent。例如,如果视觉元素包含子元素,则当指针不再位于父元素或子元素上时,父元素将收到此事件。当指针仍在其子元素之一上时,父元素将不会收到 PointerLeaveEvent,即使它不再是指针下方的最顶层元素。它将改为接收 PointerOverEvent

target:指针退出的视觉元素(或其后代之一)。

PointerOverEvent

当指针进入视觉元素时,将发送 PointerOverEvent

target:指针下方的视觉元素。

PointerOutEvent

当指针离开可视元素时,将发送 PointerOutEvent

target:指针退出的视觉元素。

PointerStationary事件

当指针类型(如触控笔或手指)在作系统确定的设定时间内未更改时,将发送 PointerStationaryEvent

target:捕获指针的视觉元素,或指针下最顶层的可选择元素。

指针取消事件

当作系统取消指针作时,将发送 PointerCancelEvent

target:捕获指针的视觉元素,或指针下最顶层的可选择元素。

例子

以下代码示例创建一个编辑器窗口,其中包含一个包含黄色框的红色框。当指针离开可视元素或其子元素时,它会将消息打印到控制台。它演示了 PointerOutEventPointerLeaveEvent 的行为。

要查看示例的实际效果,请执行以下作:

  1. 资源>脚本(Assets Scripts) > 编辑器下,创建一个名为 PointerEventsTestWindow.uxml 的新UXML文件
  2. 将下面的 UXML 代码复制到其中
  3. Assets > Scripts > Editor 下,创建一个名为 PointerEventsTestWindow.cs 的新 C# 文件
  4. 将代码示例复制到 C# 脚本中。
  5. 从 编辑器工具栏(Editor Toolbar) 中,选择 窗口(Window) > UI 工具包(UI Toolkit) > 指针事件测试窗口(Pointer Events Test Window) 。

UXML 代码

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
    <ui:VisualElement style="flex-grow: 1; justify-content: center; align-items: center;">
        <ui:VisualElement name="Red_Box" style="background-color: rgb(183, 34, 46); width: 50%; height: 50%; align-items: center; justify-content: center;">
            <ui:VisualElement name="Yellow_Box" style="width: 175%; height: 50%; background-color: rgb(197, 163, 0);" />
        </ui:VisualElement>
    </ui:VisualElement>
</ui:UXML>

C# 代码


using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;

public class PointerEventsTestWindow : EditorWindow
{
    [MenuItem("Window/UI Toolkit/Pointer Events Test Window")]
    public static void ShowExample()
    {
        PointerEventsTestWindow wnd = GetWindow<PointerEventsTestWindow>();
        wnd.titleContent = new GUIContent("Pointer Events Test Window");
    }

    public void CreateGUI()
    {
        // Import UXML
        VisualTreeAsset visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Scripts/Editor/PointerEventsTestWindow.uxml");
        visualTree.CloneTree(rootVisualElement);

        // Get the red box and register pointer event callbacks
        VisualElement redBox = rootVisualElement.Q("Red_Box");
        redBox.RegisterCallback<PointerOutEvent>(OnPointerOutEvent, TrickleDown.TrickleDown);
        redBox.RegisterCallback<PointerLeaveEvent>(OnPointerLeaveEvent, TrickleDown.TrickleDown);
    }

    private void OnPointerLeaveEvent(PointerLeaveEvent evt)
    {
        Debug.Log($"Pointer LEAVE Event. Target: {(evt.target as VisualElement).name}");
    }

    private void OnPointerOutEvent(PointerOutEvent evt)
    {
        Debug.Log($"Pointer OUT Event. Target: {(evt.target as VisualElement).name}");
    }
}

其他资源

小组活动
工具提示事件