ステート変数には、ステートトランジションを関連付けることが可能です。
備考:ステート変数に関する初歩的な説明はステート変数を参照してください。
ステートトランジションは、ステート変数の値の変化と共に発生します。 このようなトランジションは、ステート変数を参照する、state要素の中のtransition要素にて明示的に処理します。 関連項目: transition、 state。 特定のtransition要素の中に宣言されている処理は、そのトランジションが関連付けられているステート変数が そのトランジションで宣言された値に遷移すると発生します。 この処理とは、transition要素の中で宣言されているスクリプトの実行やビジュアル要素の表示を指します。 ステート変数が他の値に遷移すると、transition要素に記述されているビジュアル要素はデバイス画面から消去されます。
備考: ステートトランジションによってビジュアル要素が無効になっても、 UJMLアプリケーションが画面上の同じ場所でなんらかの描画を行わない限り、そのビジュアル要素が画面上に表示されたままになることがあります。このため、アプリケーション作成時には画面全体をカバーする背景画面の使用をお勧めします。 関連項目: ビジュアル要素、 background.ujms sample。
ステート変数の変更によりステートトランジションが発生すると、プログラムの制御はそのトランジションに分岐します。 トランジションの処理が完了すると、処理は元に戻ります。制御が分岐するという意味では、 ステートトランジションはサブルーチンに似ていると考えることができます。 関連項目: 実行順序。
ステートトランジションには手続き型(スクリプティング)と宣言型の両要素を記述することが可能である点で、サブルーチンと異なります。 手続き型の要素はステートトランジションが発生すると実行されます(サブルーチンと同様に)。しかし 宣言型の要素はステートトランジションが発生した際に有効になり、ステートが他の状態に遷移しない限り、有効であり続けます。 宣言型の要素には、ビジュアル要素やオーディオ要素といったものが含まれます。 関連項目: ビジュアル要素、 オーディオ要素。
例えば、ステートトランジションがビジュアル要素としてboxを宣言していた場合、そのステートトランジションが発生するとboxが画面に表示され、ステートがその他のトランジションに移るとboxは画面から消去されます(前例を参照)。同様に、boxの中のイベントハンドラはステートトランジションの有効期間中にのみ、有効であり、ステートが他のトランジションに移ると、イベントを受け付けなくなります。 関連項目: イベントの処理。
トランジションが有効となりビジュアル要素が表示された場合、ビジュアル要素の宣言が参照している変数には、 その変数の現在値が使用されます。例えばlabel要素の表示位置やテキストの設定にこの仕組みを応用することが可能です。 この場合、あらかじめlabel要素の表示位置とテキストの値を変数に設定しておき、次に、ステート変数の値をそのlabel要素を表示するトランジションの値に設定します。ステートトランジションが有効になった後に変数の値が変更されても、label要素に影響はなく、同じ位置で、同じ内容のテキストを表示します。ステートトランジションが一旦無効になり(labelが画面から消え)ステートトランジションが再度有効になると、labelの描画に新たな値が使用されます。
トランジション中の処理は遅延実行することが可能です。 関連項目: トランジション内の遅延実行、 スクリプティング。 しかしトランジション中のUJMLコードのうち、非スクリプト部分はトランジションの発生とともに即座に実行され、 制御は呼び出しもとのコードに戻されます。このため遅延実行する処理はイベントのように後から実行されることになります。 トランジション中のビジュアル要素は即座に描画され、オーディオ要素は即座に再生されます。
遅延実行部分によって使用される変数には、スクリプトが実行されたときの最新の値が使用されます(ステートトランジションが発生したときの値ではないことに注意してください)。コードの書き方と、遅延時間の長さにより変数の値が異なってくる可能性があります。
ステートトランジションのスクリプティングコードからトランジションの宣言と同一モジュールスコープ内の変数やステート変数の値を変更することができます。 関連項目: データのスコープと共有。 これは、ステート変数の値を設定しモジュールの状態が変化した場合、副作用が発生する可能性があることを意味しています。 関連項目: 副作用。
boolean型のステート変数では、ステート変数が取りうる値として2つのトランジション(trueとfalse)のみを定義可能です。 その他のデータ型の場合は何千ものトランジションを定義可能です。 関連項目: データ型。 トランジション要素は何かを行う、あるいは画面に何かを表示する場合に、 アプリケーションが取り得る状態の1つ1つに対して定義することが可能です。ステート変数の値が ステートトランジションにて宣言されている値に設定されると、トランジションが発生し、そのステートトランジションが有効になります。
ステートトランジションはその性質上、1つのステート要素の中で同時に有効に設定できるのは1つのトランジションに限られます。これは、特定のステート変数においてステートトランジションが発生した場合、ステート変数は既存のステートトランジションから「抜ける」ことを意味しています。この性質を利用することによって、1つのステート変数に必用なだけの状態を用意し、そのうちの1つを有効にする、といった使い方をすることができます。
ステート変数が配列型である場合、state要素のindex属性を使用し配列のどの次元のトランジションを有効にするかを指定します。例:'<state var="sFoo" index="1, 3">'。 この場合、state要素に記述されているtransition要素はそのtransition要素のインデックスが変更された場合にのみ有効となります。前述の例では、'sFoo[1][3] = true'はトランジションが有効となりますが、 'sFoo[2][1] = true'では有効となりません。
UJMLは配列型のステート変数において、配列内の全ての要素に適用されるデフォルトのステートを定義する機能を提供しています。この機能を利用するには、state要素のデフォルト値を指定したい各次元のindex属性にアスタリスク('*')を記述します。例: '<state var="sFoo" index="*, *">'。この例では、state要素に記述したtransition要素は配列型ステート変数の全ての要素に適用します。
トランジション中のデフォルトのステートの現在のインデックスは、_state_index()を使用して求めることが可能です。 関連項目: _state_index() function。
ステートトランジションから抜け、そのステートを無効にする方法は2つあります。 1つ目の方法は、前述のようにステート変数の値を他の値に設定する方法です。ステートの値に、実在するトランジションの値を設定すると、そのトランジションが有効となります。しかし実在しないトランジションの値を設定すると、そのステートのトランジションは全て無効になります。
2つ目の方法は_clear_state()関数を使用して、ステート変数の値を変更せずにトランジションから抜ける方法です。 関連項目: _clear_state() function。 この方法は、トランジションを現在の値に再設定したい場合にとても便利です。この方法を行うには、_clear_state()関数の引数にステート変数の名前を指定してからステート変数に自分自身の値を代入します。
ステートトランジションは、ステート変数を宣言したファイルとは別のパーティションで宣言することができます。 関連項目: ファイルのリンク、 スコープ、 データのスコープと共有。
ステートマシンに記述されているpublicなステート変数のステートトランジションは、applicationまたはpartitionモジュールで宣言することが可能です。 関連項目: ステートマシン、 スコープ、 データのスコープと共有。
一つのステート変数には複数のstate要素を宣言することができます。 この場合も、ステート要素に記述されているステートトランジションのうち、適切な値が定義されているステートトランジションが有効となります。 しかし、複数のステートトランジション要素が同じステートの値を記述されている場合、一番高いz-orderをもっているトランジションのみが有効となります。 関連項目: Z-Order。 その他のステートトランジションは無効となります。 この法則は、同一モジュール中の異なるステート要素の中のトランジションにも、モジュール間で共有されているトランジションにも適用されます。 ファイルのリンク、 スコープ、 ステートマシン。
|
項目 |
説明 |
|
ステートトランジションではスクリプティング要素の実行を遅延させることが可能。 |
次の例では、ステート変数 'sShow'がtrueに遷移すると、 デバイス画面になんらかのテキストを表示します。 このサンプルコードはtransition1.ujml サンプルコードの一部です。
<ujml>
<application>
<state-variables>
<state-var name="sShow" type="boolean"/>
</state-variables>
<script>
sShow = true;
</script>
<states>
<state var="sShow">
<transition value="true">
<display>
<label><text>Hello World!</text></label>
</display>
</transition>
</state>
</states>
</application>
</ujml>
次の例では、transitionの値に1,2,3と4をもつ整数型のステート変数 'sShow'を 使用しています。各トランジションはscriptとdelay要素を使用して短期間のディレイ後 'sShow'の値をインクリメントすることにより画面上に'Foo'という文字列のアニメーションをループ表示します。 トランジションが最後の値に到達すると、 'sShow'には最初の値が設定され、アニメーションが再度 開始されます。 このサンプルコードはtransition2.ujml サンプルコードの一部です。
<ujml>
<application>
<state-variables>
<state-var name="sShow" type="int"/>
</state-variables>
<script>
sShow = 1;
</script>
<states>
<state var="sShow">
<transition value="1">
<display>
<label><text>F</text></label>
</display>
<delay>100</delay>
<script>sShow = 2;</script>
</transition>
<transition value="2">
<display>
<label><text>Fo</text></label>
</display>
<delay>100</delay>
<script>sShow = 3;</script>
</transition>
<transition value="3">
<display>
<label><text>Foo</text></label>
</display>
<delay>200</delay>
<script>sShow = 4;</script>
</transition>
<transition value="4">
<delay>100</delay>
<script>sShow = 1;</script>
</transition>
</state>
</states>
</application>
</ujml>
次の例では配列型のステート変数を使用してデバイスの画面上にメッセージを複数回表示します。 ステートトランジションが発生すると、メッセージを表示し、短期間のディレイ後、次のトランジションの発生をトリガーします。 この例ではステート変数の現在のインデックス値を求め、次の値を有効にするため_state_index() 関数を 使用しています。 このサンプルコードはtransition3.ujml サンプルコードの一部です。
<ujml>
<application>
<state-variables>
<state-var name="sShow" type="boolean" size="20"/>
</state-variables>
<script>
sShow[0] = true;
</script>
<states>
<state var="sShow" index="*">
<transition value="true">
<display>
<label>
<text>Hello World</text>
<x><eval>_state_index(0) * 10</eval></x>
<y><eval>_state_index(0) * 10</eval></y>
</label>
</display>
<delay>200</delay>
<script>
if (_state_index(0) &_LT; 19)
{
sShow[_state_index(0) + 1] = true;
}
</script>
</transition>
</state>
</states>
</application>
</ujml>
次の例では、ステートトランジションを使用してスライドショーを実現しています。スライドショーのテキストは、配列のインデックスに変数を使用して取得しています。このコードには記述されている遅延実行のスクリプトブロックはインデックス変数の値を更新し、ステートの値が既にtrueであっても、ステートトランジションが再度発生するよう_clear_state() 関数を使用しています。このサンプルコードはassignment.ujml サンプルコードの一部です。
<state var="sText">
<transition value="true">
<display>
<multi-label>
<text><eval>mMessages[mMessageIdx]</eval></text>
<width><eval>mScreenWidth</eval></width>
<height><eval>mScreenHeight</eval></height>
</multi-label>
</display>
<delay>&DELAY_MSEC;</delay>
<script>
// Set index for next message.
mMessageIdx = mMessageIdx + 1;
if (mMessageIdx &_GTE; &MESSAGE_COUNT;)
{
mMessageIdx = 0;
}
// Show next message.
_clear_state(sText);
sText = true;
</script>
</transition>
</state>|
Copyright (c) 2000-2005 by UIEvolution, Inc. All rights reserved.
|
|
この項目に関するフィードバックをお寄せください。 Send feedback!
|