画面上にテキストを表示する
Alexa Presentation Languageを使用する大半のスキルでは、簡単なテキストを表示しています。このドキュメントでは、Viewportにシンプルなテキストコンテンツを配置する方法を説明します。
背景付きの短いヘッドラインを表示する
背景付きの短いテキストを画面に配置する最も簡単な方法は、Alexa Headline(AlexaHeadline
)レスポンシブ対応テンプレートを使用することです。表示するテキスト、使用する背景(色、画像、ビデオなど)、ヘッダーまたはフッターテキストを指定します。背景やヘッダーテキスト、フッターテキストは任意です。テンプレートはこれらすべてをViewportに表示するよう処理し、異なるサイズのViewportに合わせてレイアウトを自動的に調整します。テンプレートは自動的にViewport全体に表示されます。
Alexa Headlineでは、primaryText
とsecondaryText
のテキストを指定できます。第1テキストは画面の中央に大きなフォントで表示され、2行を超えると切り詰められます。第2テキストはそれより小さく、1行に制限されます。
このテンプレートは、表示するテキストが非常に少ない場合に使用します。デザインのガイダンスについては、Headlineを参照してください。
Alexa Headlineを使用して背景付きのシンプルなテキストを配置する方法
alexa-layouts
の最新バージョンをドキュメントのimport
配列に追加します。{ "import": [ { "name": "alexa-layouts", "version": "1.5.0" } ] }
-
AlexaHeadline
コンポーネントをmainTemplate
のitems
配列に追加します。少なくとも、表示するテキストをprimaryText
に設定します。{ "type": "AlexaHeadline", "primaryText": "表示するヘッドラインのテキストです。", "secondaryText": "オプションの第2テキストです。" }
すべてのパラメーターについては、
AlexaHeadline
を参照してください。
以下の例では、背景の上にテキストを表示し、ヘッダーのアトリビューション画像を右上に、ヒントを下に表示しています。テキストプロパティにデータバインディング式を使用し、例の後に提供されたデータソースheadlineExampleData
を使用しています。
AlexaHeadlineのフッターにヒントを含める
「今日のチーズ」の例では、テンプレートのフッターはtextToHint
トランスフォーマーを使用し、「今日のチーズについてのジョークを教えて」というテキストをヒントとして適切な書式に設定しています。トランスフォーマーは、ユーザーのデバイスに設定されているウェイクワード(「アレクサ」、「エコー」など)を追加し、テキストを引用符で囲んで、先頭に「試してみよう」を追加します。
詳細については、コンテンツを背景、境界線、ヘッダーと結合するのヒントにデバイスのウェイクワードを使用するを参照してください。
Textコンポーネントで独自のデザインを作成する
テキストを表示するには、ドキュメントにText
コンポーネントを配置して、そのtext
プロパティを設定します。text
プロパティを設定するには、データソースとデータバインディングを使用します。
以下の例では、画面に「Hello World!」と表示します。この例では、helloworldData
というデータソースからText
コンポーネントのコンテンツを取得します。この例では、viewportの左上隅にデフォルトのフォントスタイルとサイズで「Hello World!」と表示されました。
この例では左上隅にコンテンツを表示しているため、一部のviewportではうまく表示されません。たとえば、このドキュメントを円形のviewportに表示すると、テキストの一部が表示されません。
これを解決するため、APLでは、viewportでコンポーネントの配置やフォーマットを設定するさまざまな方法を提供しています。
Container
内にコンポーネントを配置します。Container
は、1つのコンポーネントを表示するmainTemplate
とは異なり、複数の子コンポーネントを表示することができます。その子コンポーネントのレイアウト方法を指定するさまざまなオプションも提供しています。- テキストを格納する非表示のバウンディングボックス</em>のサイズを指定してテキストを制約し、
Text
コンポーネントの配置プロパティ(textAlign
およびtextAlignVertical
)を使用してボックス内にテキストを配置します。 padding
プロパティ(paddingTop
、paddingLeft
など)を使用して、コンポーネントの周囲にマージンとスペースを追加します。すべてのAPLコンポーネントにこれらのプロパティがあるため、レイアウトのニーズに応じて、Text
コンポーネント自体、またはその親コンポーネントでプロパティを設定できます。- テキストのスタイル、文字表現のプロパティ、マークアップを使用して、書式を設定します。
テキストの書式を設定する
Text
コンポーネントには、テキストの見た目をコントロールするfontSize
、fontStyle
、fontFamily
、letterSpacing
などのさまざまなプロパティがあります。これらのプロパティの詳細については、Text
コンポーネントのプロパティを参照してください。Alexa Stylesパッケージには、これらの値を設定するときに使用できるリソースとテキストスタイルが含まれているため、一貫性のある見た目に整えることができます。
また、テキスト内でいくつかの基本的なマークアップタグを使用してインラインで書式設定をすることもできます。
Textコンポーネントのバウンディングボックスを理解する
Text
コンポーネントには、テキストが内側から出ないように制約する非表示のバウンディングボックスがあります。このボックスのheight
とwidth
は、対応するText
コンポーネント自体のプロパティで設定できます。
Text
コンポーネントのheight
プロパティとwidth
プロパティが指定されていない場合、デフォルトのauto
になります。つまり、バウンディングボックスは、コンポーネントの親の制約内で、コンテンツに合わせたサイズになります。
たとえば、height/widthを100vh
/100vw
に設定したContainer
があり、そのContainer
がViewport全体に表示されるとします。次の表は、このContainer
内にText
コンポーネントのバウンディングボックスを配置してText
コンポーネントのheight
プロパティとwidth
プロパティをさまざまな方法で設定したときに、バウンディングボックスがどのように機能するかをまとめたものです。
Textコンポーネントのheightとwidthの設定 | バウンディングボックスの動作 |
---|---|
|
バウンディングボックスは、 |
|
バウンディングボックスは、親 |
|
バウンディングボックスは指定された絶対サイズを持ちますが、親 そのため、 |
|
バウンディングボックスはコンテンツに必要なだけのスペースを占有し、さらに拡張されて
|
バウンディングボックスは常に長方形
テキストバウンディングボックスは常に長方形です。円形の画面を搭載しているデバイスでは、バウンディングボックスの端に近いテキスト(上下など)が切れることがあります。以下の例では、円形のviewportで切り取られたText
コンポーネントが表示されます。ドロップダウンリストから別のViewportを選択すると、同じコードが長方形のViewportでどう表示されるかを確認できます。
この例は、長方形のViewportでは判読可能ですが、テキストが画面の端まで広がっているため見栄えがよくありません。円形デバイスでは、画面のそれぞれの端でテキストが切れているため読めなくなっています。
これを修正するには、padding
プロパティを使用してテキストの周囲にスペースを作り、バウンディングボックスの端から離します。paddingTop
プロパティとpaddingBottom
プロパティのパディングを大きくすると、円形のViewportには特に有効です。
以下の例では、Alexa Stylesパッケージで提供されているSpacingリソースを使用して、テキストの周囲にパディングを追加しています。また、同じパッケージのtextStyleBody
スタイルを使用して、本文テキストに合わせてテキストを書式設定し、textAlign
プロパティを使用してテキストを中央に配置しています。
テキストの見栄えを良くするために使えるテクニックについては、さまざまなサイズの画面でテキストの見栄えを良くするを参照してください。
以降のセクションでは、Text
コンポーネントのバウンディングボックスと、コンポーネント内のテキストを配置するためのプロパティを組み合わせた例をいくつか紹介します。
例: 自動サイズに設定したTextコンポーネント
以下は、Viewport全体に表示されるContainer
内で、サイズがautoに設定されているText
の例です。テキストは必要なだけの領域を占有します。テキストバウンディングボックスの高さはテキスト自体とまったく同じであるため、textAlignVertical
プロパティの効果はありません。
例: 相対的な高さと幅のTextコンポーネント
以下は、Text
コンポーネントのheight
とwidth
を相対ディメンション(100%)に設定した例です。Text
コンポーネントのバウンディングボックスは、コンテンツに必要なサイズに関係なく、Container
全体のサイズになります。そのため、textAlignVertical
などの配置プロパティを使用してテキストを配置できます。
例: Container全体に広がるTextコンポーネント
また、grow
プロパティを1に設定することで、Text
コンポーネントのサイズが親Containerの使用可能なスペース量に基づいて動的に調整されるようにすることもできます。grow
プロパティは、Text
コンポーネントがContainer
内にある場合のみ適用できます。このため、その他のContainerの子プロパティも用意されています。
このオプションは、Container
内に複数のコンポーネントを配置する場合に便利です。以下は、2つのText
コンポーネントのうち、1つをViewportの上部に、もう1つを下部に表示した例です。grow
プロパティを使用すると、2番目のコンポーネントのバウンディングボックスが1番目のコンポーネントの後に残っているすべての垂直方向のスペースを埋めるため、textAlignVertical
でテキストをViewportの下部に配置できます。
grow
とshrink
プロパティは0~1の値を受け付け、縦横比を維持して機能します。たとえば、grow
を0.5
に設定すると、Container
内の空きスペースの半分を埋めるようにコンポーネントが広がります。
長いスクロールテキストを表示する
Text
コンポーネントはスクロールしないため、小型デバイスでは長いコンテンツが切り詰められることがあります。長いコンテンツがある場合は、ScrollView
コンポーネントを使用して、テキストやその他のコンポーネント用に画面上にスクロール可能な領域を作成します。ユーザーは画面にタッチすることで、コンテンツをスクロールできます。また、ScrollView
を設定すると、ユーザーが「アレクサ、下にスクロールして」などの発話によって、音声でコンテンツをスクロールできるようになります。
ScrollViewでTextコンポーネントを表示する
ScrollView
には、1つの子コンポーネントがあります。テキストブロックを表示するには、Text
コンポーネントをScrollView
の子として使用します。複数のコンポーネントを表示するには、Container
内にコンポーネントを配置し、そのContainer
をScrollView
の子として使用します。
以下は、Viewportの大部分を使用する領域にある大きなテキストブロックで、すべての辺にパディングがある場合の例です。この例ではScrollView
が唯一のトップレベルコンポーネントであるため、ScrollViewをmainTemplate
に直接配置します。この例は、すべてのテキストを表示するにはスクロールが必要なデバイス、横長、小のViewportに表示されています。ドロップダウンリストから別のViewportを選択すると、ScrollView
が別のViewportでどう表示されるかを確認できます。
デバイスのタッチによるスクロールをシミュレートするには、Viewportのプレビュー領域内でクリックしてドラッグします。
円形Viewportにパディングを使用する
円形デバイスでテキストが切れるのを防ぐには、ScrollView
の上部に十分なパディングを使用します。前の例では、spacingSmall
リソースにpaddingTop
を設定しました。これは長方形のViewportでは機能しますが、円形のViewportでは適切に表示されません。
円形Viewportの場合はpaddingTop
の値を増やします。textAlign
を使用してテキストを水平方向にセンタリングして、テキストコンテンツをViewportの最大の部分に入れ込み、カーブしている端から離すようにしてください。
カスタムスタイルとリソースを使用して、Viewportなどの条件に基づいてこれらのプロパティを異なる値に設定できます。詳細については、この後のさまざまなサイズの画面でテキストの見栄えを良くするで説明します。
スクロールコンテンツの上や下に固定領域を作成する
ScrollViewでTextコンポーネントを表示するの例では、テキストがViewportの下まで流れて表示されるため、paddingBottom
プロパティは使われていないように見えます。ScrollView
の「top」と「bottom」は、スクロール可能なコンテンツを含むコンポーネントの全体の垂直サイズに基づいています。パディングプロパティは、スクロール可能なコンテンツの最初と最後にパディングを追加します。コンテンツの最後までスクロールすると、パディングが表示されます。
スクロールコンテンツの上または下にスクロールしない領域が必要な場合は、Container
の中にScrollView
を配置して、ScrollView
ではなくContainer
にパディングプロパティを設定します。
小型デバイスではスクロールコンテンツの周りに固定領域を使用することはお勧めしません。ただでさえ小さなデバイスのコンテンツ領域が狭まるためです。デバイスごとに異なるレイアウトを作成するには、when
プロパティを使用します。
- 小型の円形デバイスの場合は、
ScrollView
自体のパディングプロパティを設定します。これにより、スペースが画面外にスクロールし、コンテンツを表示できる領域が広がります。ScrollView
内にほかのコンポーネント(ヘッダーやフッターなど)を配置すると、画面上のすべてのコンテンツがスクロールできるようになります。 - ほかのすべてのタイプのViewportでは、
ScrollView
をContainer
の中に配置します。Container
のパディングを設定し、画面上に残すほかのコンポーネントは、ScrollView
ではなくContainer
の子コンポーネントとして含めます。
ヘッダーやフッターなどの固定領域にコンテンツを表示する場合も、同様の方法で行うことができます。コンテンツを背景、境界線、ヘッダーと結合するのスクロールテキストをヘッダーおよびフッターと結合するを参照してください。
ユーザーが音声でコンテンツをスクロールできるようにする
ユーザーは画面をタッチしてScrollView
をスクロールできますが、音声でもコンテンツをスクロールさせることができます。
ビルトインインテントを使用して、音声ベースのスクロールを有効にします。
AMAZON.ScrollDownIntent
AMAZON.ScrollUpIntent
AMAZON.PageUpIntent
AMAZON.PageDownIntent
AMAZON.MoreIntent
ScrollView
は常に垂直方向にスクロールするので、左右にスクロールするビルトインインテントは効果がありません。
ユーザーがこれらのインテントを呼び出すために話す可能性のある発話の例については、画面付きのAlexa搭載デバイスで使用できる標準ビルトインインテントを参照してください。
ScrollView
にid
が設定されている場合、スキルではこれらのインテントがすべて自動的に処理されます。ユーザーがこれらのインテントを呼び出してもスキルはリクエストを受け取りません。また、インテント用のハンドラーを作成する必要はありません。ユーザーが音声でコンテンツをスクロールできるようにする
- 対話モデルに、スクロール用のビルトインインテントを追加します。
AMAZON.ScrollDownIntent
AMAZON.ScrollUpIntent
AMAZON.PageUpIntent
AMAZON.PageDownIntent
AMAZON.MoreIntent
- 対話モデルを再ビルドします。
- ドキュメントで、
ScrollView
コンポーネントのid
プロパティをIDに設定します。そのドキュメント内で一意のIDを使用します。
ScrollView
にid
を指定しない場合、スクロールインテントは機能しません。
スキルをテストするときは、ScrollView
を表示するインテントを呼び出し、スキルの言語に合った妥当な発話を使用します。次に例を示します。
…ScrollView
を表示する対話です。この応答はshouldEndSession
が未定義のままであることに注意してください。そのため、セッションは開いていますが、マイクは閉じています。
ユーザー: アレクサ、下にスクロールして(マイクを開くにはウェイクワードを使用する必要があります)。
コンテンツがスクロールされ、より多くのコンテンツが表示されます。
さまざまなサイズの画面でテキストの見栄えを良くする
テキストを使用する場合、どのような画面付きのAlexaデバイスでもテキストが見栄えよく読みやすく表示されるように、注意すべき点があります。
簡潔な見出しのテキストを表示する場合は、Alexa Headlineレスポンシブ対応テンプレートを使用するのが最も簡単な方法です。このレイアウトは、さまざまなデバイスでうまく動作するように構築されているため、コンテンツを提供するだけで済みます。
独自のレイアウトを作成する場合は、以下のセクションの推奨事項を参考にしてください。
配置プロパティと文字表現プロパティのスタイルを使用する
フォントサイズ、配置、その他の文字表現プロパティなどテキストの表示特性を設定するには、スタイルを使用します。Alexa Stylesパッケージで事前定義されているスタイルを使用することも、独自のスタイルを作成することもできます。スタイルでは、when
句を使用して、現在のViewportなどの条件に基づいて表示特性を調整できます。
前述の例では、Text
コンポーネントでtextStyleBody
スタイルを使用していました。このスタイルは、長い形式のコンテンツに適しており、さまざまなViewportのフォントサイズを自動的に調整します。
独自のカスタムスタイルを作成することも、ひな形として定義済みのスタイルを使用することもできます。たとえば、円形デバイスでテキストを中央に配置すると見栄えがよい場合は、textStyleBody
をベースとしてカスタムスタイルを定義できます。このスタイルは、hubRoundSmall
プロファイルを持つViewport上のテキストを中央に配置しますが、ほかのすべてのタイプのViewportではデフォルト(auto)の設定のままです。
{
"styles": {
"customTextStyleBody": {
"extend": "textStyleBody",
"values": [
{
"when": "${@viewportProfile == @hubRoundSmall}",
"textAlign": "center"
}
]
}
}
}
プロパティ値にリソースを使用する
Text
コンポーネントのプロパティ値を設定するときに、ハードコーディングした値ではなく、リソースを使用することを検討してください。リソースとは、値を割り当てることができる名前付き定数です。スタイルと同様に、when
句を使用してリソースを作成し、Viewportなどの条件に応じて値が変更されるようにできます。リソースはスタイルとは異なり、任意のプロパティを設定するために使用できます。
Alexa Stylesパッケージには、いくつかの事前定義されたリソースも含まれています。Text
については、次の項目を参照してください。
Text
コンポーネントを示した前述の例では、パティングプロパティにスペースのリソースを使用していました。marginHorizontal
リソースとspacing3XLarge
リソースは、Viewportに基づいて自動的に調整されます。
たとえば、小型の円形デバイスには異なるパディングを設定してバウンディングボックスの端からテキストを離すことができます。
{
"resources": [
{
"dimensions": {
"myTopAndBottomSpacing": "@spacingSmall"
}
},
{
"when": "${@viewportProfile == @hubRoundSmall}",
"dimensions": {
"myTopAndBottomSpacing": "@spacing3XLarge"
}
}
]
}
指定した値が必要な任意の場所で@
構文を使用します。この例では、paddingBottom
プロパティとpaddingTop
プロパティの両方がmyTopAndBottomSpacing
リソースに設定されています。
{
"type": "ScrollView",
"id": "simpleScrollViewExample",
"height": "100vh",
"paddingLeft": "@marginHorizontal",
"paddingRight": "@marginHorizontal",
"paddingBottom": "@myTopAndBottomSpacing",
"paddingTop": "@myTopAndBottomSpacing",
"items": [
{
"type": "Text",
"text": "${payload.scrollTextData.properties.simpleScrollingText}",
"style": "customTextStyleBody"
}
]
}
小型デバイスでテキストを切り詰める
コンテンツによっては、より小型のデバイスでは長いテキストを切り詰めたり非表示にしたりする必要があります。たとえば、前述のgrowの例を考えてみましょう。大型のViewportでは、2つのText
コンポーネントの間にスペースがあります。小型の円形デバイスでは、コンポーネントは間にスペースがない状態で表示され、少しでも長いとテキストが切れてしまいます。
このシナリオでは、2番目のText
コンポーネントのmaxLines
プロパティを設定できます。これにより、指定した行数内に収まらないテキストが切り詰められて省略記号(「…」)が追加され、意図的にテキストが終わっていることがより明確になります。
スタイルを使用して、Viewportに応じて条件付きでmaxLines
を設定します。この例では、customTextStyleBody
は、Alexa StylesパッケージのtextStyleBody
スタイルを拡張し、すべてのViewportに対してtextAlignVertical
を設定します。そして、hubRoundSmall
のtextAlign
とmaxLines
を変更します。
{
"styles": {
"customTextStyleBody": {
"extend": "textStyleBody",
"values": [
{
"textAlignVertical": "bottom"
},
{
"when": "${@viewportProfile == @hubRoundSmall}",
"textAlign": "center",
"maxLines": 3
}
]
}
}
}
以下は、小型の円形デバイスに切り詰められたテキストが表示される例です。別のViewportを選択すると、同じドキュメントとデータソースが大型のViewportではテキスト全体をどう表示するかを確認できます。
さまざまなデバイスでドキュメントを見栄えよく表示する方法については、レスポンシブ対応のAPLドキュメントを作成するを参照してください。
関連トピック
- コンテンツを背景、境界線、ヘッダーと結合する
- レスポンシブ対応のAPLドキュメントを作成する
- Textコンポーネント
- Alexa Stylesパッケージ(
alexa-styles
) - APLスタイルの定義と評価
最終更新日: 2022 年 08 月 25 日