使用状态机

使用状态来定义您的 Kanzi 应用程序在不同状态下的外观和行为。例如,您可以使用状态来:

  • 设置布局中项的大小以在项被选定时突出项。

  • 应用程序处于特定状态时,显示或隐藏用户界面的某些部分。

  • 根据应用程序的状态启用或禁用应用程序中的控件,例如按钮。

  • 动画化应用程序。

在状态中设置的属性会重写默认、继承和本地属性值。请参阅 属性优先级。

小技巧

在 Kanzi Studio 的 Node Tree 窗口中,当状态机、绑定、数据源绑定或动画覆盖了某个节点中部分属性的值时,该节点旁边会显示一个指示灯。

../../_images/node-override-notice.png

要在 Kanzi Studio 工程中导航至覆盖的源,请右键点击覆盖指示灯,然后在上下文菜单中选择要导航至的源。

您可以通过以下方式定义两种状态之间的变化:

  • 为状态组设置控制器属性,并为每个状态设置该属性的值。这些可以是隐式属性,例如 Button 节点的 Is Down 属性。当属性更改时,无论是作为节点固有逻辑的一部分还是指定的 Set Property 动作或动画,状态都会发生变化。请参阅 使用控制器属性设置状态。

  • 使用 State Manager 操作 Go to State、Next State 和 Previous State。如果您使用 State Manager 操作和控制器属性,请注意,当控制器属性更改时,它会覆盖先前设置的状态。请参阅 使用状态管理器操作来设置状态。

通过完成以下教程之一学习如何使用状态机:

创建状态机

在您的 Kanzi 应用程序中使用状态机来控制节点的状态。

例如,状态机可以定义切换按钮的状态。状态机设置切换按钮在打开和关闭时的外观。

要创建状态机:

  1. 在 Node Tree 中选择 Toggle Button 2D 节点,并在 State Tools 中单击 Create State Manager。

    您可以在 Preview 窗口下方找到 State Tools 窗口。

    Kanzi Studio 创建一个新的状态管理器并将其分配给 Toggle Button 2D 节点。

    ../../_images/create-state-manager2.png
  2. 在 State Tools 中,双击 Create State 以创建两个状态。双击每个状态的名称并重命名这些状态。

    例如,将一个状态命名为 On,另一个命名为 Off。

    On 状态定义了当切换按钮被打开时应用程序的状态,Off 状态定义了当切换按钮被关闭时的状态。

    要删除某个状态,右键点击该状态并选择 Delete。

    ../../_images/rename-states.png
  3. 使用 State Tools 来定义切换按钮的指示器在开启和关闭状态下的位置:

    1. 将切换按钮指示器定位,并在 State Tools 中单击 image0 下的 On 状态,以将指示器的当前位置保存到该状态。

      例如:在 Preview 中,使用 Node tool 来定位指示器。

      ../../_images/indicator-positioned.png ../../_images/add-indicator-to-on-state.png
    2. 对 Off 状态重复上一步,并在 State Tools 中将切换按钮指示器的当前位置保存到该状态。

      ../../_images/indicatoroff-image.png ../../_images/add-indicator-to-off-state.png

小技巧

在 Kanzi Studio 的 Properties 窗口中,值由 State Manager 设置的属性以蓝色字体标记,并在其旁边显示 State Manager 图标 StateManager:

../../_images/state-manager-overrides-property-value.png

橙色字体标记具有多个覆盖源的属性:

../../_images/property-value-invalid-override.png

如果一个属性有多个覆盖源,只有优先级最高的那个会生效。请参阅 属性系统。

使用控制器属性设置状态

在状态管理器中,您选择为 Controller Property 的属性值定义了状态组中每个状态何时处于活动状态的条件。

状态机中的各个状态组可以使用不同的控制器属性。

您还可以使用自定义属性类型作为状态组的控制器属性。请参阅 教程:创建集群指示器。

要使用控制器属性:

  1. 创建一个状态管理器并设置一个节点以使用该状态管理器。请参阅 创建状态机。

    例如,创建设置两种状态下切换按钮外观的状态机。

  2. 在 State Tools 中,单击 <No Controller Property> 下拉菜单并选择一个属性。要创建自定义控制器属性,请单击 <No Controller Property> 下拉菜单并选择 + Create Property Type。

    例如,选择 Toggle Button > Toggle State 属性。当您将 Toggle State 设置为控制切换按钮状态的状态管理器的控制器属性时,状态管理器会根据该属性的值转换到某个状态。

    ../../_images/add-controller-property.png
  3. 在 State Tools 中,为每个状态设置控制器属性的值。

    例如:

    • 对于 On 状态,将值设置为 1。

    • 对于 Off 状态,将值保持为 0。

    ../../_images/set-controller-property.png
  4. 在 State Tools 中,单击 Edit State Manager 以停用 State Tools。

    ../../_images/deactivate-state-tools.png

当您在 Preview 中点击切换按钮时,您将在您在 Toggle Button 2D 节点中创建的状态管理器中定义的 On 和 Off 状态之间切换。

使用状态管理器操作来设置状态

使用 State Manager 操作将您的 Kanzi 应用程序设置为进入不同状态。

要在状态机中设置状态,您可以使用这些动作:

将状态机设置成特定状态

使用 Go to State 操作将状态管理器设置为特定状态。

要将状态机设置成特定状态:

  1. 创建内容,您要定义其处于不同状态时的外观和行为。

    例如,使用 Factory Content 中的 Car。

    请参阅 使用 Factory Content 资产。

    ../../_images/factory-content-car-in-project.png ../../_images/factory-content-car-red.png
  2. 创建状态机和状态,您可在其中设置您在上一步中创建的内容的外观和行为。请参阅 创建状态机。

    例如,为 CameraRoot 节点创建一个状态管理器,其中包含三个状态,分别命名为 Brakes、Roof 和 Suspension,每个状态从不同的角度显示汽车。请参阅 使用 Camera 节点。

    ../../_images/factory-car-camera_root-node.png ../../_images/camera-root-states.png ../../_images/brakes-preview.png ../../_images/roof-preview.png ../../_images/suspension-preview.png
  3. 将状态机设置成特定状态:

    1. 创建或选择要用于将应用程序设置成状态机中特定状态的节点,为该节点添加用于更改状态的触发器。

      例如,创建一个 Button 节点,并向其添加一个 Button: Click 触发器。请参阅 使用触发器。

      ../../_images/brakes-button-in-project.png ../../_images/button-click-trigger.png ../../_images/brakes-button-and-car-in-preview.png
    2. 在 Node Components > Triggers 按 Alt 并右键单击 中,选择您要用于将状态管理器设置为特定状态的触发器,选择 Dispatch Message Action > State Manager > Go to State,并在 Go to State 操作中设置:

      • Target Item 到使用状态管理器的节点到您想要转换的状态。

      • State 到您希望节点转换到的状态。

      ../../_images/click-add-go-to-state-action.png ../../_images/go-to-state-settings.png
  4. 为您在此程序中之前创建的所有状态重复上一步。

    例如:为每个状态创建一个 Button 节点,并在每个按钮的 Button: Click 触发器中添加 Go to State 操作。

    ../../_images/roof-and-suspension-in-project.png ../../_images/roof-with-go-to-state-action.png ../../_images/suspension-with-go-to-state-action.png ../../_images/car-and-buttons-in-preview.png

点击创建的按钮之一时,将触发执行动作的触发器,该动作使状态机进入该动作中设置的状态。

../../_images/go-to-state-action.gif

将状态机设置成下一个或上一个状态

使用 Next State 和 Previous State 操作将状态管理器设置为状态组中的下一个或上一个状态。请参阅 使用状态组。

要将状态机设置成下一个或上一个状态:

  1. 创建内容,您要定义其处于不同状态时的外观和行为。

    例如,使用 Factory Content 中的 Car。

    请参阅 使用 Factory Content 资产。

    ../../_images/factory-content-car-in-project.png ../../_images/factory-content-car-red.png
  2. 创建状态机和状态,您可在其中设置您在上一步中创建的内容的外观和行为。请参阅 创建状态机。

    例如,为 CameraRoot 节点创建一个状态管理器,其中包含三个状态,分别命名为 Brakes、Roof 和 Suspension,每个状态从不同的角度显示汽车。请参阅 使用 Camera 节点。

    ../../_images/factory-car-camera_root-node.png ../../_images/camera-root-states.png ../../_images/brakes-preview.png ../../_images/roof-preview.png ../../_images/suspension-preview.png
  3. 创建或选择要用于将应用程序设置成状态机中下一个或上一个状态的节点,为该节点添加用于更改状态的触发器。

    例如,创建一个 Button 节点,并向其添加一个 Button: Click 触发器。请参阅 使用触发器。

    ../../_images/next-button-in-project.png ../../_images/button-click-trigger.png
  4. 在用于将状态更改为下一个或上一个状态的触发器中,添加并配置 Next State 或 Previous State 操作。

    例如:在 Node Components > Triggers 按 Alt 并右键单击 中,Button: Click 触发器,选择 Dispatch Message Action > State Manager > Next State,并在 Next State 操作集中:

    • 将 Target Item 到具有状态管理器的节点,您希望更改其状态。

    • 将 State Group 到包含您要转换到的状态的状态组。

    • 将 (可选) Loop State 设置为启用,以使状态管理器在到达最后一个状态后返回到第一个状态。

    • (可选) Immediate 设置为禁用,以便将状态管理器设置为使用您在状态管理器中设置的动画在状态之间进行过渡。当您启用此属性时,状态管理器会立即更改状态,而不播放过渡动画。请参阅 使用状态迁移。

    ../../_images/add-next-state-action.png ../../_images/next-state-settings.png

点击该按钮时,将触发执行动作的触发器,该动作使状态机进入该动作中设置的状态。

../../_images/next-state-action.gif

节点进入或离开某个状态时的反应

当节点在两个状态之间迁移时,Kanzi:

  1. 取消应用节点退出的状态,断开该状态的触发器。

  2. 发送 StateManager::LeftStateMessage 消息。

  3. 应用节点进入的状态,连接该状态的触发器。

  4. 发送 StateManager::EnteredStateMessage 消息。

../../_images/state-manager-triggers.svg

要在节点进入状态时做出反应,您可以使用节点中的 Entered State 消息触发器或节点进入的状态中的 On Attached 触发器。要在节点离开状态时做出反应,请使用该节点中的 Left State 消息触发器。

要在节点进入或离开某个状态时作出反应:

  1. 在 Node Tree 中,选择您希望对进入或离开状态做出反应的节点,在 Node Components > Triggers 中添加以下任一项:

    • Entered State 消息触发器在节点进入状态时做出反应。

    • Left State 消息触发器在节点离开状态时做出反应。

    例如:

    1. 在 Node Tree 中,选择一个使用具有两个状态的状态管理器的 Text Block 3D 节点,State A 和 State B。

      ../../_images/text-block-3d-in-project.png
    2. 在 Node Components 按 Alt 并右键单击 Triggers 中,选择 Message Trigger > State Manager > Left State。

      使用 Left State 触发器在 Text Block 3D 节点离开 State A 时做出反应。

      ../../_images/add-left-state-trigger.png
  2. 在 Node Components > Triggers 按 Alt 并右键单击 中,触发您在上一步中添加的触发器,然后选择一个操作。

    例如,选择 Write Log 操作,并将 Log Text 设置为您希望在触发器被触发时写入 Log 窗口的消息。Write Log 操作在您想验证节点是否接收到输入时很有用。

    要了解有关 Write Log 操作的更多信息,请参阅 使用 Write Log 操作。

    ../../_images/left-state-trigger-add-write-log-action.png ../../_images/left-state-write-log-message.png
  3. 在您在第一步中创建的触发器中的 Node Components > Triggers 中,右键单击 Conditions,选择 Trigger Condition,并设置您要用于该触发器的条件。请参阅 使用消息中的值创建条件。

    例如:在触发条件集中,对于 Left State 触发器:

    • A

      • Type of A 到 Message argument

      • Message Argument 到 State

    • Operation 到 =

    • B

      • Type of B 到 Fixed

      • Fixed Value 到您希望触发器响应的状态名称。

        例如,将其设为 State A。

    ../../_images/left-state-trigger-add-condition.png ../../_images/left-state-trigger-condition.png

当节点离开您在触发条件中指定的状态时,Kanzi 会在 Log 窗口中打印您在 Write Log 操作中输入的消息。

要打开 Log 窗口,在主菜单中选择 Window > Log。

../../_images/log-window-left-state-message.png

使用状态组

状态组包含状态,定义控制器属性,以及状态组中状态之间的转换。使用状态组可以平滑地控制应用程序中的状态和转换。例如,一个按钮的状态管理器可以包含三个状态组:按钮按下、按钮释放和悬停在按钮上。在每个状态组中,您创建状态,使用状态对象定义按钮在每个状态下的行为。

要使用状态组:

  1. 在 State Tools 中,单击 + Create State Group 以创建状态组,并输入您创建的状态组的名称。

  2. 在 State Tools 中,将鼠标指针悬停在状态组上以设置该状态组记录的属性。设置不同的状态组以记录不同属性值的变化。使用 All 选择或取消选择所有属性。

    要复制或移除某个状态组,将鼠标悬停在状态组上方并选择 Duplicate 或 Remove。

    ../../_images/hover-over-state-group.png

在 API 中使用状态机

有关详细信息,请参阅 StateManager 类。

另请参阅

教程:创建一个按钮

教程:创建一个切换按钮

教程:创建集群指示器

状态机 (State Manager)

使用状态迁移

使用 Button 节点

使用 Toggle Button 节点

属性系统

属性类型

使用触发器