Adobe Flex 3 ヘルプ

サイズ設定と配置について

Flex は、一連の規則に従ってコンポーネントのレイアウトを制御します。レイアウト規則は、個々のコンポーネントのサイズ設定規則と、コンテナのサイズ設定規則および配置規則を組み合せたものです。Flex では自動レイアウトをサポートしているので、多くの場合、最初にコンポーネントのサイズまたは位置を設定する必要はありません。レイアウトの制御は Flex に任せ、開発者はアプリケーションのロジックの構築に専念することができます。必要に応じて、後でインスタンスのサイズを調整できます。

各コンテナには、レイアウトを制御するための独自の規則があります。例えば、VBox コンテナでは、子は 1 つの列にレイアウトされます。Grid コンテナでは、子は行および列のセルにレイアウトされます。パディングは、Application コンテナでは 24 ピクセル、他の多くのコンテナでは 0 ピクセルです。

Flex にはビルトインのデフォルトレイアウト規則がありますが、コンポーネントのプロパティとメソッドを使用してレイアウトをカスタマイズできます。すべてのコンポーネントには、heightwidth など、コンポーネントのサイズを絶対値またはコンテナに対する相対値で指定するための複数のプロパティがあります。各コンテナにも、レイアウト属性の設定に使用できるプロパティとスタイルがあります。Tile コンテナの verticalGap スタイルや horizontalGap スタイルなどの設定を使用して子同士の間隔を設定したり、direction プロパティで行または列のレイアウトを指定したりできます。コンテナ内のコンポーネントをレイアウトする際に様々な配置手法を使用することもできます。例えば、一部のコンテナでは、x 絶対座標と y 絶対座標に基づく配置をサポートしています。

Flex でのレイアウトについて

Flex では、Layout Manager によってレイアウトが制御されます。Layout Manager は、次の 3 段階のプロセスでアプリケーション内の各コンポーネントのサイズと位置を決定します。

第 1 段階 - 処理パス 

アプリケーションの各コンポーネントのプロパティ設定を決定します。この段階では、コンテンツがプロパティ設定に依存するコンポーネントを、Flex によってサイズと位置が決定される前に設定できます。



処理パスでは、各コンポーネントは Layout Manager の指示で commitProperties() メソッドを実行してプロパティ値を決定します。

第 2 段階 - 計算パス 

アプリケーション内のすべてのコンポーネントのデフォルトサイズを計算します。このパスは、最も深くネストされたコンポーネントから始まり、Application コンテナに向けて進みます。計算パスでは、各コンポーネントの測定サイズ(デフォルトサイズ)が決定されます。各コンテナのデフォルトサイズは、子のデフォルトサイズまたは明示的なサイズ(指定されている場合)に基づきます。例えば、Box コンテナのデフォルトの幅は、すべての子のデフォルトの幅または明示的な幅の合計に、境界線の太さ、パディング、子同士の間隔を加えたものと等しくなります。



計算パスでは、各コンポーネントは Layout Manager の指示で measureSizes() メソッド(measure() メソッドを呼び出すプライベートメソッド)を実行して、コンポーネントのデフォルトサイズを決定します。

第 3 段階 - レイアウトパス 

コンポーネントの移動やサイズ変更などを行って、アプリケーションをレイアウトします。このパスは最も外側のコンテナから始まり、最も内側のコンポーネントに向けて進みます。レイアウトパスでは、各コンポーネントの実際のサイズと配置が決定されます。また、lineTo() メソッドや drawRect() メソッドの呼び出しなど、プログラムによる描画も実行されます。



レイアウトパスでは、Flex は、コンポーネントのサイズ設定プロパティで親に対するパーセント値としてサイズが指定されているかどうかを判別し、その設定を使用して子コンポーネントの実際のサイズを決定します。各コンポーネントは Layout Manager の指示で updateDisplayList() メソッドを実行して、コンポーネントの子をレイアウトします。そのため、このパスを「更新パス」と呼ぶこともあります。

Flex 基準系について

Flex では、位置とサイズを決定する際に次の基準系を使用します。

  • ローカル領域とローカル座標系は、コンポーネントの外側の境界に対して相対的に表されます。コンポーネントの境界線やスクロールバーなどのビジュアルエレメントはローカル座標に含まれます。
  • 可視領域は、コンポーネントのビジュアルエレメントの内側にある領域です。つまり、この領域はコンポーネントの表示されている部分であり、子コントロール、テキスト、イメージその他のコンテンツを含めることができます。Flex には、この領域用の別の座標系はありません。
  • コンテンツ領域とコンテンツ座標系には、ビジュアルエレメントを除くコンポーネントのすべてのコンテンツが含まれます。この領域には、現在クリッピングされており、コンポーネントをスクロールしないと表示されない領域も含まれています。例えば、スクロール可能な TextArea コントロールのコンテンツ領域には、現在画面からスクロールアウトされているテキストの領域が含まれます。

Flex では、パーセント値ベースのサイズを決定するとき、および制約ベースのレイアウトを実行するときに可視領域を使用します。

絶対配置を指定するときに使用する Flex コンポーネントの x プロパティと y プロパティは、コンテンツ座標系にあります。

注意: Flex 座標は、基準系の左上隅を原点とします。したがって、ローカル座標系の x,y 位置が(100,300)の場合、コンポーネントの左上隅から右に 100 ピクセル、下に 300 ピクセルの位置を示します。

Flex 座標系の詳細については、Flex 座標の使用を参照してください。

コンポーネントのサイズ設定について

コンポーネントの高さと幅は、計算パスとレイアウトパスで決定されます。これらのサイズを取得するには、height プロパティと width プロパティを使用します。これらのプロパティや他のプロパティを使用して、コンポーネントのサイズを制御できます。

Flex では、次の方法でコントロールとコンテナのサイズを制御できます。

デフォルトサイズ設定  

コントロールとコンテナのサイズが自動的に決定されます。



明示的なサイズ設定  

height プロパティと width プロパティを絶対値に設定します。



パーセント値ベースのサイズ設定 

コンポーネントのサイズをコンテナのサイズに対するパーセント値で指定します。



制約ベースのレイアウト 

コンポーネントの端をコンテナ内の特定の位置に固定することにより、サイズと位置を制御します。



コンポーネントのサイズの制御の詳細については、コンポーネントのサイズ設定を参照してください。

コンポーネントの配置について

Flex では、アプリケーションを初期化するときにコンポーネントを配置します。また、アプリケーションまたはユーザーがビジュアルエレメントのサイズまたは位置に影響する可能性のある何らかの操作を実行した場合にも、レイアウトパスを実行し、コンポーネントを配置または再配置します。例えば、次のような場合です。

  • アプリケーションによって、サイズ設定を指定するプロパティ(xywidthheightscaleXscaleY など)が変更された場合。
  • 変更によってコンポーネントの計算済みの幅または高さが影響を受ける場合。例えば、Button コントロールのラベルテキストが変更された場合や、ユーザーがコンポーネントのサイズを変更した場合などです。
  • コンテナに子を追加するか、コンテナから子を削除した場合、子のサイズを変更した場合または子を移動した場合。例えば、アプリケーションでコンポーネントのサイズを変更できる場合、コンテナのレイアウトが更新され、子の新しいサイズに基づいて子が再配置されます。
  • horizontalScrollPolicyfontFamily など、測定や描画を必要とするプロパティまたはスタイルが変更された場合。

まれに、アプリケーションプログラマがコンポーネントのレイアウトを強制的に実行することが必要な場合があります。詳細については、レイアウトの手動での強制実行を参照してください。

Flex は、コントロールの配置とレイアウトのための次の 2 つのメカニズムを備えています。

自動配置 

Flex は、コンテナおよびコンポーネントに固有の一連の規則に従って、コンテナの子を自動的に配置します。Box、Grid、Form などのほとんどのコンテナでは、自動配置を使用します。自動配置は、「自動レイアウト」と呼ばれることもあります。



絶対配置 

それぞれの子の x プロパティと y プロパティを指定するか、制約ベースのレイアウトを使用します。制約ベースのレイアウトでは、コンテナの 1 つまたは複数の端と子の端、ベースラインまたは中心との距離を指定します。絶対配置は、「絶対レイアウト」と呼ばれることもあります。



絶対配置は、次の 3 種類のコンテナでサポートされています。

  • Application コンテナと Panel コンテナは、デフォルトで自動配置を使用しますが、layout プロパティを "absolute" に指定した場合は絶対配置を使用します。
  • Canvas コンテナは、常に絶対配置を使用します。

コントロールの位置の制御の詳細については、コントロールの配置とレイアウトを参照してください。

コンポーネントのレイアウトパターン

Flex では、コンテナとその子をレイアウトする際に、コンテナのタイプによってそれぞれ異なるレイアウトパターンを使用します。通常、これらのパターンは、次の表に分類されたタイプのいずれかに一致します。この表は、各タイプの一般的なレイアウト動作、コンテナのデフォルトサイズの決定方法およびパーセント値ベースの子のサイズ設定方法をまとめたものです。

コンテナのタイプ

デフォルトのレイアウト動作

絶対配置:Canvas コンテナ、または layout="absolute" が指定されている Application または Panel コンテナ

一般的なレイアウト: コンテナの子が相互に影響し合うことはありません。つまり、ある子の位置がその他の子の位置に影響することはなく、子同士が重なって表示される場合があります。子の位置を明示的に指定するか、制約を使用して子の端、ベースラインまたは中心を親コンテナに対して相対的に固定します。

デフォルトサイズ設定: 計算パスで下端が最も下にある子と右端が最も右にある子が特定され、それらの値を使用してコンテナのサイズが決定されます。

パーセント値ベースの子: サイズ設定では、制約ベースのレイアウトと、x 座標および y 座標による配置のどちらを使用しているかによって異なる規則が使用されます。詳細については、絶対配置を使用したコンテナでのパーセント値ベースの子のサイズ設定を参照してください。

すべての子を直線的に配置するコントロール(Box、HBox、VBox など)

一般的なレイアウト: コンテナのすべての子が 1 つの行または列に配置されます。それぞれの子の高さと幅は、他のすべての子の高さまたは幅と異なる場合があります。

デフォルトサイズ設定: すべての子のデフォルトサイズまたは明示的なサイズとすべての間隔、境界線およびパディングが収まるようにコンテナのサイズが決定されます。

パーセント値ベースの子: パーセント値ベースのサイズ設定を使用する子が要求するサイズが使用可能領域よりも大きい場合、要求されたパーセント値に比例するサイズの領域に収まるように実際のサイズが設定されます。

Grid

一般的なレイアウト: このコンテナは、実質的には、すべてのアイテムが整列するように制約された HBox 子コントロールの行を含む VBox コントロールです。1 つの行に含まれるセルの高さはすべて同じですが、行ごとに高さを変えることができます。また、1 つの列に含まれるセルの幅はすべて同じですが、列ごとに幅を変えることができます。Grid コンテナの行または列ごとに異なる数のセルを定義することができ、個々のセルが複数の列または行にまたがってもかまいません。

デフォルトサイズ設定: 個々の行および子がデフォルトサイズで収まるようにグリッドのサイズが決定されます。

パーセント値ベースの子: 子がパーセント値ベースのサイズ設定を使用している場合、リニアコンテナのサイズ設定規則に従って、子 GridItem コンポーネントは行内に、GridRow コンポーネントはグリッドサイズ内にそれぞれ収められます。

Tile

一般的なレイアウト: このコンテナは、同じサイズのセルがグリッド状に並んだものです。セルの順序は、行優先にも列優先にもできます。

明示的なサイズまたはパーセント値ベースのサイズを指定しない場合、必要に応じて、より多くのアイテムを含む方向を決定する direction プロパティが使用され、コントロールの行数と列数は可能な限り同数に近づきます。

デフォルトサイズ設定: tileWidth プロパティと tileHeight プロパティを指定しない場合、コンテナでは最大の子セルの測定サイズまたは明示的なサイズが各子セルのサイズに使用されます。

パーセント値ベースの子: 子コンポーネントのパーセント値ベースのサイズは、Tile コンテナに対するパーセント値ではなく、個々のセルに対するパーセント値を指定します。

ナビゲータ:ViewStack、Accordion、TabNavigator

一般的なレイアウト: このコンテナは、子を 1 つずつ表示します。

デフォルトサイズ設定: コンテナのサイズは、最初に選択された子の測定サイズまたは明示的なサイズによって決定されます。その後、残りのすべての子にその初期サイズが適用されます。resizeToChild プロパティを true に設定すると、それぞれの子が表示されたときに、その子の測定サイズまたは明示的なサイズに合わせてコンテナのサイズが変更されます。

パーセント値ベースの子: 原則として、高さと幅の両方に 100 %を指定するか、パーセント値ベースのサイズ設定を使用しないようにします。前者の場合、子がナビゲータの範囲全体を満たします。

基本的なレイアウト規則と注意事項

Flex では、次の基本規則に従ってレイアウトを実行します。これらの規則を覚えておくと、Flex でのレイアウトの詳細を理解しやすくなり、アプリケーションがそのようにレイアウトされた理由や、アプリケーションの外観を変更する方法を判断する上で役立ちます。

Flex でのコンポーネントのサイズ設定方法の詳細については、コンポーネントのサイズの決定と制御を参照してください。コンポーネントの配置の詳細については、コントロールの配置とレイアウトを参照してください。

  • Flex では、まず、すべてのコンポーネントの測定(デフォルト)サイズまたは明示的に設定されたサイズを決定します。このサイズは、最も内側の子コントロールから順に決定され、最後に最も外側のコントロール(Application コントロール)のサイズが決定されます。これは、計算パスで実行されます。
  • 計算パスが終了すると、次にパーセント値ベースのすべてのサイズを決定し、コンポーネントをレイアウトします。レイアウトは、最も外側のコンテナから開始され、最後に最も内側のコントロールがレイアウトされます。これは、レイアウトパスで実行されます。
  • 開発者がピクセル値に設定したサイズは強制的に適用される固定サイズであり、コンポーネントに対して設定した最大サイズまたは最小サイズの指定よりも優先されます。
  • 計算パスで決定されたデフォルトサイズは、明示的なサイズまたはパーセント値ベースのサイズが設定されていない(または制約ベースのレイアウトを使用する)コンポーネントのサイズを指定するものであり、このサイズは固定されます。
  • パーセント値ベースのサイズ指定は、おおよその基準となるものです。レイアウトアルゴリズムは可能であればこの要求を満たし、パーセント値を使用して比例サイズを決定しますが、実際のサイズが要求されたサイズよりも小さくなる場合があります。パーセント値ベースのサイズは常にコンポーネントの最大サイズと最小サイズの範囲内にあり、それらの範囲の制約を受けます。パーセント値ベースのサイズを使用した場合、コンテナの子がコンテナのサイズを超えることはありません。

レイアウトの手動での強制実行

プログラムによってコンポーネントを再度レイアウトすることが必要になる場合があります。通常、Flex は、大量の計算を必要とするプロパティをスクリプトによって設定するときに、そのスクリプトの実行が終了するまでそれらのプロパティの処理を遅延します。例えば、width プロパティを設定すると、オブジェクトの子またはその親の幅の再計算が必要となることがあるので、このプロパティの設定は遅延されます。処理を遅延することにより、スクリプトで width プロパティが複数回設定された場合に、その処理を何度も繰り返すのを防ぐことができます。ただし、スクリプトが完了する前に、レイアウトを強制的に実行することが必要になる場合もあります。

レイアウトを強制的に実行する必要がある状況として、次のような場合が考えられます。

  • PrintDataGrid クラスを使用して複数ページのデータグリッドを印刷する場合。
  • エフェクトを再生する前に、ターゲットで開始値が設定された場合。
  • プロパティを変更した後にビットマップデータをキャプチャする場合。

レイアウトを強制的に実行するには、レイアウトする必要のあるコンポーネントの validateNow() メソッドを呼び出します。このメソッドを呼び出すと、オブジェクトとそのすべての子のプロパティ、サイズおよびレイアウトが検証および更新され、必要に応じて再描画されます。このメソッドは計算負荷が高いので、必要な場合にのみ呼び出すように注意してください。

validateNow() メソッドの使用例については、PrintDataGrid レイアウトの更新を参照してください。

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート