ティックイベントハンドラー
ティックイベントは、時間が経過すると発生します。handleTickイベントハンドラーを使用して、ティックイベントを取得し、時間に基づいて定期的にコマンドを実行できます。
ドキュメントとコンポーネントのティックイベントハンドラー
ティックハンドラーは、コンポーネントレベルまたはドキュメントレベルで定義できます。すべてのコンポーネントにhandleTickプロパティがあります。Alexa Presentation Language(APL)ドキュメントには、最上位のhandleTickプロパティもあります。
| プロパティ | 型 | デフォルト | スタイル設定 | 動的 | 説明 |
|---|---|---|---|---|---|
| handleTick | ティックハンドラーの配列 | [] | × | × | ティックイベントが発生したときに実行するハンドラーです。 |
たとえば、次の例は、コンポーネントレベルのhandleTickプロパティを使用するTouchWrapperを示しています。このティックハンドラーは、TouchWrapperがpressed状態にある限り、RepeatCounter変数を約100ミリ秒ごとにインクリメントします。ユーザーがコンポーネントを解放し、pressed状態が終了すると、onPressハンドラーはカウンターを0にリセットします。
ティックハンドラーのプロパティ
単一のティックハンドラーは、以下の表のプロパティを持つオブジェクトです。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
commands |
コマンドの配列 | 必須 | このハンドラーが呼び出された場合に実行するコマンドです。 |
description |
文字列 | "" | (任意)このティックハンドラーの説明です。 |
minimumDelay |
数値 | 1000 | このハンドラーが再度呼び出される前に経過する必要がある最小期間(ミリ秒)です。 |
when |
ブール値 | true | trueの場合、このハンドラーが呼び出されます。 |
ティックハンドラーの配列は並列に実行されます。各ティックハンドラーには、when句があります。ティックハンドラーは、次の条件の両方が満たされたときに実行されます。
- ハンドラーの
when句がtrueと評価されたとき。 - このティックハンドラーが最後に実行されてから、
minimumDelayミリ秒以上経過したとき。
個々のAPL実行環境は、不定期にティックハンドラーをチェックして実行できます。APL実行環境は1秒間に60回以上ティックハンドラーをチェックする必要がありますが、リソースに制約のある環境ではチェック頻度を少なくすることもできます。
たとえば、ティックハンドラーのminimumDelayを30に設定すると、APLは最多で30ミリ秒ごとにティックハンドラーを呼び出します。頻度はこれより低くなる場合があります。ティックカウンターを経過時間の測定に使わないでください。代わりに、elapsedTimeプロパティ、utcTimeプロパティのいずれかを使用します。
commands
このティックハンドラーが呼び出されたときに実行するコマンドの配列です。
生成されるイベントの形式は次のようになります。
"event": {
"source": {
"type": "COMPONENT_TYPE", // コンポーネントの種類または"ドキュメント"
"handler": "Tick",
"id": ID, // コンポーネントIDまたはnull(ドキュメントの場合)
"uid": UID, // ランタイムで生成されたコンポーネントの一意IDまたはnull(ドキュメントの場合)
"value": NUMBER // コンポーネントの値またはnull(ドキュメントの場合)
}
}
ティックコマンドは常に高速モードで実行されます。
minimumDelay
このティックハンドラーを次に呼び出すまでに経過する必要のある最小時間(ミリ秒)です。
when
trueの場合、システムがティックイベントを検出すると、このハンドラーが実行されます。
ティックハンドラーの例
アニメーションの例
ティックハンドラーを使用して、コマンドを定期的に実行するステートマシンを作成できます。以下は、ランダムな間隔(およそ4秒に1回)で信号機のライトを切り替えます。
レート制限
ティックハンドラーを使用してレート制限を追加できます。たとえば、ユーザーが画面をスクロールする情報を定期的にスキルに渡す必要があるとします。
ティックハンドラーがない場合、SendEventコマンドをScrollViewのonScrollハンドラーに割り当てることができます。このアプローチでは、スクロールして表示内容が変わるたびにコマンドがシステムに大量のSendEventメッセージを送信するため、問題が生じます。
{
"type": "ScrollView",
"onScroll": {
"type": "SendEvent",
"sequencer": "SendEventSequencer",
"arguments": [
"今の位置:${event.source.position}"
]
}
}
これを改善するには、handleTickハンドラーを使ってメッセージを抑制します。次の例では、ティックハンドラーが更新情報を送信する頻度を1秒あたり1回に制限し、最後に報告した位置が変更された場合に更新したスクロール位置を送信します。
レート制限がどのように機能するかを説明するために、上部のTextコンポーネントには、ScrollPosition変数とLastScrollPosition変数の値が表示されています。コンテンツをスクロールすると、ScrollPositionの値がリアルタイムで更新されます。コンテンツをスクロールした場合、LastScrollPositionは2秒ごとに更新されます。ティックハンドラーのminimumDelayプロパティを変更して、更新頻度を変えてみてください。
この例のSendEventコマンドをテストするには、この例をスキルにコピーしてください。
関連トピック
最終更新日: 2025 年 12 月 12 日