处理用户输入¶
您可以设置应用程序中的哪些元素与用户输入交互以及如何交互。在 Kanzi 中,要处理用户输入,您可以:
启用节点的手势和按键识别。请参阅 使用输入操纵器。
控制节点对输入的反应。请参阅 控制节点对输入的反应方式。
定义哪些节点接收输入。请参阅 定义哪个节点接收输入。
设置3D节点输入区的大小。请参阅 设置3D节点输入区的大小。
对于这些 Kanzi 节点,您不必手动创建输入操控器,因为它们默认情况下会处理输入:
Button 节点。请参阅 使用 Button 节点。
Toggle Button 节点。请参阅 使用 Toggle Button 节点。
List Box 节点。请参阅 List Box nodes。
List Box Item Container 预设。请参阅 使用 List Box Item Container 预设。
Scroll View 节点。请参阅 使用 Scroll View 节点。
Slider 节点。请参阅 使用 Slider 节点。
Text Box 节点。请参阅 使用 Text Box 节点。
触发器和动作可用于创建基于用户输入的交互。
请参阅 使用触发器。
使用输入操纵器¶
Kanzi 提供对输入的低级和高级访问:
高级别系统提供手势输入,如点击、平移、捏合等。建议使用高级别系统将手势绑定到UI组件或应用程序功能。
低级输入系统在节点中报告原始触摸事件。
Kanzi 提供输入操控器,以启用在您的 Kanzi 应用程序中对节点的手势识别。您可以创建和配置这些操控器:
在 Kanzi Studio 中使用 Input Manipulators 节点组件和输入操控器触发器。
通过 Kanzi Engine API
Kanzi 提供以下输入操控器:
|
使用 Click Manipulator 使用户能够在您的 Kanzi 应用程序中点击节点。 请参阅 使用 Click Manipulator。 |
|
使用 Long-Press Manipulator 使用户能够在您的 Kanzi 应用程序中长按节点。 |
|
使用 Multi-Click Manipulator 使用户能够在您的 Kanzi 应用程序中多次点击节点。 |
|
使用 Key Manipulator 来设置用户可以用来导航您的应用程序的键。例如,您可以覆盖默认的焦点导航键,并使用特定键将焦点设置到一个节点,设置一个键来打开或关闭弹出类型的窗口,或在焦点链中移动焦点。 请参阅 使用 Key Manipulator。 |
|
使用 Navigation Manipulator 设置用户可以用来在您的应用程序中导航到不同方向的键。 |
|
使用 Drag-And-Drop Manipulator 使用户能够在您的 Kanzi 应用程序中拖放节点。 |
|
使用 Pan Manipulator 使用户能够在您的 Kanzi 应用程序中移动节点。 请参阅 使用 Pan Manipulator。 |
|
使用 Pinch Manipulator 使用户能够在您的 Kanzi 应用程序中缩放和旋转节点。 请参阅 使用 Pinch Manipulator。 |
在 Kanzi Studio 中,当您选择一个节点并在 Node Components > Input Manipulators 中创建一个输入操控器节点组件时,Kanzi 会将相应的输入操控器安装到该节点。Kanzi Studio 提供这些输入操控器组件以启用手势识别:
Click Manipulator
Key Manipulator
Long-Press Manipulator
Multi-Click Manipulator
Navigation Manipulator
Pan Manipulator
在 Kanzi Engine API 中,InputManipulator 是输入操控器的基类,函数如 ClickManipulator::create 和 PanManipulator::create 创建负责相应手势识别的输入操控器。
当您创建输入操纵器时,要识别手势,通过 Node::addInputManipulator 将其附加到节点上。此函数也会附加该节点的所有子节点。
附加的输入操控器会根据用户操作生成消息。每个操控器使用消息报告手势识别过程中的不同事件,例如,PanManipulator::StartedMessage、PanManipulator::MovedMessage、PanManipulator::FinishedMessage 用于平移操控器,等等。
控制节点对输入的反应方式¶
使用 Input > Enabled 属性来控制节点对输入的反应。
小技巧
默认情况下,Button、List Box、Scroll View、Slider 和 Text Box 节点处理输入,并且在它们被禁用时不响应输入。
当您禁用节点的 Enabled 属性时,您实际上禁用了该节点及其在同一覆盖焦点范围内的子节点。
这意味着,当您禁用包含叠加焦点范围节点的节点的 Enabled 属性时,该叠加中的节点实际上仍然处于启用状态。
Kanzi 也将输入传递给实际禁用的节点。这使您能够控制禁用节点的行为。
当您有效地禁用一个节点时:
当节点获得焦点时,它会接收键输入,直到焦点移动到另一个节点。
当节点未聚焦时,它不属于焦点链的一部分,并且不会接收键输入。
要观察节点是否有效启用,使用状态管理器或绑定中的 Input > Effectively Enabled 属性。例如,要向用户直观地指示节点是否正在使用,创建一个状态管理器并使用 Effectively Enabled 属性作为其控制器属性。
要了解有关 Kanzi 状态管理器的更多信息,请参阅 状态机 (State Manager)。
要控制节点对输入的反应:
在 Node Tree 或 Prefabs 中选择节点,在 State Tools 中创建一个状态组,并命名它。
例如,命名状态组 Enabled。
在 State Tools 中创建两个状态,一个定义节点在使用时的外观和行为,另一个定义节点在未使用时的状态。
例如,将状态命名为 Enabled 和 Disabled。
对于每个状态,定义该状态下节点的外观和行为。
例如,要设置节点在未使用时的外观,请在 Disabled 状态下将 Opacity 属性设置为 0.3。
在 State Tools 中,将 Controller Property 设置为 Input > Effectively Enabled。
Effectively Enabled 属性指示节点及其祖先节点是否启用。
在 State Tools 中,将 Effectively Enabled 控制器属性在 Disabled 状态下的值设置为 False。
通过这种方式,您可以将应用程序设置为使用:
Disabled 状态表示节点未使用且不响应输入。
当节点正在使用并对输入做出反应时的 Enabled 状态。
在 State Tools 中,单击 Edit State Manager 以停用 State Tools。
当您更改 Input > Enabled 属性的值时,节点的外观会发生变化。当您禁用 Enabled 属性并尝试在 Preview 中与节点交互时,节点不会有反应。
定义哪个节点接收输入¶
当创建用户界面时,请注意您的应用程序如何处理输入,因为一次只能有一个节点接收输入。例如,定义点击是由前面的节点处理还是由后面的节点处理。
Kanzi 使用命中测试来确定接收输入的节点。在实践中,命中测试根据输入事件的屏幕坐标从相机向 3D 场景投射一条射线。
默认情况下,Button、Toggle Button、List Box Item Container、Scroll View、Slider 和 Text Box 节点启用了命中测试。
要为任何其他节点类型的节点启用命中测试,请将 Input > Hit Testable 属性添加到该节点并启用。 当该节点或其祖先启用了 Hit Testable 属性时,3D 节点的命中测试已启用。
从 Camera 节点开始,第一个其边界框被相交且启用了命中测试的3D节点接收输入,消耗事件,并生成设置操作,例如发送点击消息。
例如,如果您放置两个 Box 节点,使 BoxFront 节点位于 BoxRear 节点之前并挡住它:
当 BoxFront 节点的 Hit Testable 属性启用时,BoxFront 节点接收输入。
The BoxRear node receives the input even though it is occluded by the BoxFront node when:
BoxFront 节点的 Hit Testable 属性被禁用。
BoxRear 节点的 Hit Testable 属性已启用。
设置3D节点输入区的大小¶
在 Kanzi 中,3D 节点的命中测试默认情况下基于该节点的边界框。
当您要更改3D内容接收输入的区域时,使用 Input > Hit Testable Container 属性。
当您启用 Hit Testable Container 属性时,Kanzi 在输入区域中包括具有该属性的 3D 节点的实际布局大小及其任何子节点的实际布局大小。3D 节点的实际布局大小由 Actual Layout Width、Actual Layout Height 和 Actual Layout Depth 属性的值决定。
对于这些节点,Hit Testable Container 属性默认情况下已启用:
Button 3D
List Box Item Container 3D
Scroll View 3D
Slider 3D
要设置某种其他类型的3D节点输入区的大小,添加并启用这些属性:
Hit Testable Container
Hit Testable
请记住,如果一个节点不是布局控制节点或布局控制节点的子节点,则该节点的实际布局大小为零。例如,Empty Node 3D 或其父节点不是布局控制节点的 Model 节点的实际布局大小为零。当您想使用这样的节点来设置输入区域的大小时,请将该节点放置在布局控制节点中。请参阅 布局控制节点。
例如,一个包含 Box 节点的 Stack Layout 3D 节点接收点击输入:
当 Stack Layout 3D 节点的 Hit Testable Container 属性被禁用时,从由 Box 节点的 Width、Height 和 Depth 属性定义的区域中。
当 Stack Layout 3D 节点的 Hit Testable Container 属性启用时,从由 Stack Layout 3D 或 Box 节点的 Layout Width、Layout Height 和 Layout Depth 属性定义的区域中。
在您的应用程序中禁用输入处理¶
Kanzi 应用程序默认情况下处理输入。要优化性能,您可以在不需要输入处理的应用程序中禁用它。当您禁用输入时,Kanzi 不会在从平台接收到的输入事件上消耗 CPU 资源。请注意,当您禁用输入处理时,应用程序也无法管理键盘焦点。
要禁用输入处理和按键焦点管理,请重写 Application::setScreenOverride 函数:
// To disable input handling and key focus management, leave the implementation empty.
void setScreenOverride() override
{
}