EPG
EPG(電子番組表)は、VUICライブラリに含まれているカスタムビューコンポーネントです。EPGコンポーネントでは、TVデバイスのリモコンを使用したD-Padコントロールがサポートされます。このガイドでは、ダウンロード可能なサンプルアプリを紹介し、EPGの使用方法の詳細について説明します。
EPGサンプルアプリ
EPGサンプルアプリはVega SDKを使用して構築されています。このサンプルアプリを使用すると、EPGコンポーネントを実装できます。
package.jsonファイルの更新
EPGコンポーネントはVUICライブラリから利用できます。package.jsonのdependenciesセクションに、次のようにVUICが指定されていることを確認してください。
"dependencies": {
// ...
"@amazon-devices/kepler-ui-components": "^2.0.0",
}
SemVer式の^は、3.0.0より前の任意の新しいバージョンを自動的に取得できることを示します。
VUICの使用方法の詳細については、Vega UIコンポーネントライブラリを使用した開発の開始を参照してください。
EPGコンポーネントの使用方法とプロパティ
以下のコード例は、EPGの使用方法を示しています。EPGコンポーネントには、updateDataメソッドを使用して、チャンネルと番組のデータを提供する必要もあります。
<EPG
ref={epg}
onScroll={({ row, timeMs }: EPGScrollEvent) => {
// ハンドラーコードをここに記述
}}
onTileFocus={({ payload, title }: EPGTileFocusEvent) => {
// ハンドラーコードをここに記述
}}
onTilePress={({ payload, title }: EPGTilePressEvent) => {
// ハンドラーコードをここに記述
}}
onMenu={({ payload, title }: EPGMenuEvent) => {
// ハンドラーコードをここに記述
}}
focusBorder={{
enabled: true,
color: '#E4E4E7',
}}
tileStyle={{
backgroundColor: '#191E25',
foregroundColor: '#E4E4E7',
focusedForegroundColor: '#E4E4E7',
elapsedBackgroundColor: '#3D3D3D',
pendingBackgroundColor: '#191E25',
}}
logoStyle={{
backgroundColor: '#FF0E25',
width: 340,
}}
/>
| プロパティ | 説明 | 型 | 省略可能 | デフォルト |
|---|---|---|---|---|
onScroll |
アニメーションの完了後、ユーザーが別のセルに移動したときのコールバック。 | (event: EPGScrollEvent) => void |
はい | |
onTileFocus |
ユーザーがセルにフォーカスを移動した(250ミリ秒以上セルをポイントした)ときのコールバック。 | (event: EPGTileFocusEvent) |
いいえ | |
onTilePress |
ユーザーがセルを選択したときのコールバック。 | (event: EPGTilePressEvent) => void |
いいえ | |
onMenu |
メニュー(3本線)ボタンが押されたときのコールバック。 | (event: EPGInteractionEvent) => void |
はい | |
onMetricEmit |
パフォーマンスに関連する特定の指標が開始されたときのコールバック。 | (event: EPGMetricsEmitEvent) => void |
はい | |
favoriteStyle |
お気に入り関連プロパティのコンテナ。 | はい | ||
favoriteStyle.imageOn |
お気に入りのチャンネルに使用する画像をassets/imageで指定します。 | はい | 画像が提供されていない場合、お気に入り機能はオフになり、お気に入りステータスを示す視覚的なインジケーターはありません。 | |
favoriteStyle.imageOff |
お気に入りではないチャンネルに使用する画像をassets/imageで指定します。 | ColorValue |
はい | #E94047 |
focusBorder |
フォーカス境界線プロパティのコンテナ。 | はい | ||
focusBorder.enabled |
フォーカス状態のセルの周囲に境界線を表示するかどうか。 | boolean |
はい | FALSE |
focusBorder.color |
フォーカス状態のセルの境界線に使用する色の値(16進数)。 | ColorValue |
はい | #FFC166 |
localizedStrings |
EPGに表示されるテキストを開発者が指定できます。localizedStringsは特に、データによって決定されないテキストを変更します。 |
はい | ||
localizedStrings.loadingText |
loadingTextは、データがまだ読み込まれていない場合に番組タイルに表示されます。 |
文字列 | はい | "番組表を読み込み中..." |
localizedStrings.unavailableText |
unavailableTextは、読み込まれたデータが無効な番組タイルに表示されます。 |
文字列 | はい | "Programming information unavailable." |
localizedStrings.favoriteAccessibilityLabel |
favoriteAccessibilityLabelは、チャンネルのアクセシビリティラベルを作成するために使用されます。このテキストは特に、そのチャンネルがお気に入りかどうかを表します。 |
文字列 | はい | "お気に入り" |
logoStyle |
チャンネルロゴ関連のスタイルプロパティのコンテナ。 | はい | ||
logoStyle.backgroundColor |
グリッドの左側にあるチャンネルロゴセルの背景色。 | ColorValue |
はい | #4A4A4A |
logoStyle.width |
グリッドの左側にあるチャンネルロゴセルの幅(ピクセル単位)(これは上部のタイムラインバーの左側に予約されているスペースにも影響します)。 | number |
はい | 363 |
overlayStyle |
オーバーレイプロパティのコンテナ(オーバーレイという用語は、番組内の現在の時間位置を視聴者に示す、番組セル内の「進捗バー」タイプのインジケーターを指します)。 | はい | ||
overlayStyle.enabled |
各番組タイル内にオーバーレイを表示するプロパティ。 | boolean |
いいえ(overlayStyleが指定されている場合) | FALSE |
overlayStyle.pendingColor |
まだ表示されていない番組を表すオーバーレイのセクションに使用する色。 | ColorValue |
はい | #3D3D3D |
overlayStyle.elapsedColor |
既に放映された番組を表すオーバーレイのセクションに使用する色。 | ColorValue |
はい | #E94047 |
tileLayout |
各番組タイルのレイアウトバリアントを指定します。デフォルトの「standard」モードでは、タイトルのみが表示されます。「expanded」では、説明と、番組の残り時間を示す自動生成テキストも表示されます。 | standard expanded |
はい | standard |
tileStyle |
タイルスタイルプロパティのコンテナ。 | はい | ||
tileStyle.backgroundColor |
デフォルトの背景色(16進数)。 | ColorValue |
はい | #2A2A2A |
tileStyle.foregroundColor |
デフォルトの前景(テキスト)色(16進数)。 | ColorValue |
はい | #F0F0F0 |
tileStyle.focusedForegroundColor |
フォーカス状態のセルの前景(テキスト)の色。 | ColorValue |
はい | #1A1A1A |
tileStyle.elapsedBackgroundColor |
セルの経過した部分の背景色(現在再生中の番組用)。 | ColorValue |
はい | #F0F0F0 |
tileStyle.pendingBackgroundColor |
セルの保留中の部分の背景色(現在再生中の番組用)。 | ColorValue |
はい | #C2C2C2 |
tileStyle.rowHeight |
各行の高さ(ピクセル単位)。 | number |
96 | |
tileStyle.fontSize |
番組タイルのテキストのフォントサイズ(EPGで使用されるサイズはほかにもありますが、それらはまだカスタマイズできません)。 | number |
32 | |
tileStyle.boldFocusedTitle |
フォーカスのあるタイルに太字のテキストスタイルを使用するかどうかを制御するブール値。 | boolean |
はい | FALSE |
tileStyle.borderRadius |
ここで指定した境界半径の値(ピクセル単位)は、番組タイルとチャンネルロゴを含むセルの形状に使用されます。値が大きいほど角が丸くなります。値が0の場合、角は四角になります。 | number |
はい | 4 |
tileStyle.tileSpacing |
番組タイル間に追加するスペースのピクセル数。 | number |
はい | 8 |
timeRange |
グリッドの時間範囲と、それに沿ったEPGの位置に影響します。 | はい | ||
timeRange.starTimeMs |
startTimeMsは、EPGのグリッドの開始点となる時刻を設定します。過去に設定すると、以前に再生された番組を表示できます。startTimeMsを現在時刻よりも後にすることはできません。 |
数値 | はい | 現在時刻は直近の30分間隔に丸められます。値はエポックからのミリ秒単位で表し、たとえば1745276430000のようになります。 |
timeRange.initialPosition |
initialPositionは、EPGの初回読み込み時に表示される最初の時間枠を設定します。initialPositionを現在時刻よりも後にすることはできません。 |
数値 | はい | 現在時刻は直近の30分間隔に丸められます。値はエポックからのミリ秒単位で表し、たとえば1745276430000のようになります。 |
timelineStyle |
タイムラインのオプションを含むプロパティ。 | はい | ||
timelineStyle.progressBar |
進行状況バーコンポーネントのタイムラインプロパティ。 | はい | ||
timelineStyle.progressBar.hidden |
進行状況バーを非表示にします。 | boolean |
はい | |
timelineStyle.playhead |
再生ヘッドコンポーネントのタイムラインプロパティ。 | はい | ||
timelineStyle.playhead.hidden |
再生ヘッドを非表示にします。 | boolean |
はい | |
timelineStyle.playhead.source |
ユーザーがカスタムの再生ヘッド画像を使用できるようにします。assets/imagesサブフォルダーにあるローカル画像のみがサポートされます。 | number |
はい | 現在の再生ヘッド画像に基づいて自動計算されます。 |
timelineStyle.playhead.height |
ユーザーが再生ヘッドの高さを指定できるようにします。指定しない場合、高さは自動計算されます。 | (event: EPGScrollEvent) => void |
はい | |
timelineStyle.playhead.width |
ユーザーが再生ヘッドの幅を指定できるようにします。指定しない場合、高さは自動計算されます。 | number |
はい | 現在の再生ヘッド画像に基づいて自動計算されます。 |
timelineStyle.playhead.height |
ユーザーがタイムラインを基準とした垂直位置を指定できるようにします。 | number |
-14 |
以下の図は、どのプロパティがどの色に対応しているかを示しています。

timelineStyleプロパティを使用したタイムラインのカスタマイズ
timelineStyleプロパティを使用すると、EPGグリッドの上にあるタイムラインをカスタマイズできます。カスタマイズできる要素は以下のとおりです。
-
進行状況バー: EPGの開始時刻からの経過時間を示す、タイムラインの赤色の強調表示部分。
-
再生ヘッド: 現在の時間を示す視覚的なインジケーター。再生ヘッド用の画像はassets/imagesフォルダーにある必要があります。

例:timelineStyleの構造
TimelineStyle {
progressBar?: {
hidden?: boolean;
};
playhead?: {
hidden?: boolean;
source?: "string"
height?: number;
width?: number;
verticalOffset?: number;
};
}
timelineStyleプロパティの詳細については、コンポーネントの使用方法とプロパティのセクションを参照してください。
お気に入りチャンネル機能
EPGコンポーネントでは、チャンネルロゴのセルの左側に、「お気に入り」チャンネルを表す視覚的なインジケーターが表示されます。お気に入り状態の「オフ」と「オン」には、ハートや星のアイコンなど、独自のロゴを使用できます。
例: お気に入りアイコン

お気に入りのチャンネルを指定するには、チャンネルオブジェクトにisFavorite: trueを設定します。ガイドを最初に表示するときは、isFavorite: falseを使用して、チャンネルがお気に入りではないことを示すカスタムのoffアイコンを表示することもできます。実行時にお気に入りの状態を変更する必要がある場合は、次の例に示すように、命令型メソッドupdateFavoriteを使用します。
例:updateFavoriteメソッド
epg.current?.updateFavorite(channelId, true);
お気に入り機能を使用するには、次の例に示すように、少なくともお気に入りの「オン」アイコン画像をプロパティで指定する必要があります。
例: お気に入りアイコン画像の追加
<EPG ...
favoriteStyle={{
imageOn: 'small_heart.png',
}}
...
チャンネルオブジェクトでimageOffが指定されていない場合、isFavoriteがfalseに指定されている行または指定がない行には「空白」の画像がレンダリングされます。お気に入りに使用する画像は、アプリパッケージソース内のassets/imageフォルダーに配置する必要があります。
命令型メソッド
EPGコンポーネントは多くのReact Nativeコンポーネントよりも複雑であるため、特定の命令型メソッドが必要です。
例: 命令型メソッドを呼び出すための参照を取得する方法
import { EPG, EPGActions } from '@amazon-devices/kepler-ui-components';
const epg = useRef<EPGActions>(null);
...
<EPG
ref={epg}
...
/>
...
epg.current?.updateGridStartTime(newGridStartTime);
resetDataメソッド
resetDataメソッドを使用すると、ガイドの既存のデータを新しいデータに置き換えることができます。resetDataメソッドは、すべてのデータを消去してからupdateDataメソッドを再度呼び出すことと同じです。
パラメーター
channelData:各要素が異なるチャンネルのデータである配列。各オブジェクトには、チャンネルの識別子(ID)と番組データの配列に関する情報が必要です。このデータ構造の詳細については、データモデルを参照してください。page(任意):チャンネルデータには直接含まれないページ関連情報をEPGコンポーネントに通知するために使用されるブール値。pageには、startTimeMsとendTimeMsという2つのオプションのサブオブジェクトが含まれます。startTimeMs(任意):照会するページの開始時刻を定義するために使用される数値。endTimeMsと共に使用する必要があります。ページ情報で開始時刻と終了時刻が提供される場合、番組情報がない部分はすべて「Unavailable」と表示されます。endTimeMs(任意):クエリされたページの終了時間を定義するために使用される数値。startTimeMsと共に使用する必要があります。ページ情報で開始時刻と終了時刻が提供される場合、番組情報がない部分はすべて「Unavailable」と表示されます。
updateDataメソッド
パラメーター
channelData:各要素が異なるチャンネルのデータである配列。各オブジェクトには、チャンネルの識別子(ID)と番組データの配列に関する情報が必要です。このデータ構造の詳細については、データモデルを参照してください。page(任意):チャンネルデータには直接含まれないページ関連情報をEPGに通知するために使用されるブール値。pageには、startTimeMsとendTimeMsという2つのオプションのサブオブジェクトが含まれています。startTimeMs(任意):照会するページの開始時刻を定義するために使用される数値。endTimeMsと共に使用する必要があります。ページ情報で開始時刻と終了時刻が提供される場合、番組情報がない部分はすべて「Unavailable」と表示されます。endTimeMs(任意):クエリされたページの終了時間を定義するために使用される数値。startTimeMsと共に使用する必要があります。ページ情報で開始時刻と終了時刻が提供される場合、番組情報がない部分はすべて「Unavailable」と表示されます。
説明
EPGコンポーネントは、チャンネルと番組のデータを内部で管理するため、データをプロパティで渡すことはできません。代わりに、updateData()関数を使用してデータを更新します。この関数の入力はチャンネルデータの配列です。各要素は異なるチャンネルのデータを表し、そのチャンネルの番組を含んでいます。次に、この入力データがEPG内の既存のEPGデータとマージされます。データをマージするために、EPGでは次の手順に従います。
- そのチャンネルのデータがEPGデータに既に存在するかどうかを確認します。チャンルは
IDプロパティによって一意に識別されます。EPGデータに同じIDのチャンネルがある場合、追加しようとしているチャンネルは既に存在しています。- チャンネルが存在する場合:
- そのチャンネルのデータレコードにアクセスします。
- チャンネルが存在しない場合:
- そのチャンネルの新しいレコードを作成します。
- チャンネルが存在する場合:
- 入力チャンネルデータからEPGデータに番組を追加します。
- EPGは、各番組について、その番組のデータが既に存在するかどうかを確認します。番組は、チャンネルと
startTimeによって識別されます。ターゲットの番組と同じstartTimeの番組がある場合、追加しようとしている番組は既に存在しています。- 番組データが既に存在する場合:
- 新しい番組データで古い番組データが上書きされます。
- 番組データが存在しない場合:
- 新しい番組の期間や再生時間が既存の番組と重複していないかどうかを確認します。
- このチャンネルの新しい番組と既存の番組の間に重複がない場合、新しい番組は適切な時刻でEPGに追加されます。
- 新しい番組の
startTimeが既存の番組のendTimeと矛盾する場合、既存の番組が短縮され、新しい番組が正しいstartTimeに追加されます。言い換えると、newProgram.startTime < existingProgram.endTimeである場合、existingProgramは、existingProgram.endTime = newProgram.startTimeとなるように更新されます。 - 新しい番組の
endTimeが時系列の次の番組のstartTimeよりも大きい場合、この新しい番組の再生時間は短縮されます。
- 新しい番組の期間や再生時間が既存の番組と重複していないかどうかを確認します。
- 番組データが既に存在する場合:
- EPGは、各番組について、その番組のデータが既に存在するかどうかを確認します。番組は、チャンネルと
使用例
以下は、アプリによるupdateDataメソッドの使用例を示しています。アプリを午後2時に開いたとします。
- アプリは、2次元ブロックのタイムライングリッドデータを照会します。この例では、返されるデータの「ページ」は、10チャンネルの12時間分の番組データです。
- アプリは、午後2時からの最初の10チャンネルのデータを照会して受信します。これをPage-0-0と呼びます。このデータは
channelDataに送信されます。内部で、新しいチャンネルと番組がデータストアに挿入されます。 - 次にアプリは、同じく午後2時からの次の10局を照会し(Page-1-0)、それを
updateDataに送信します。これにより、内部で新しいチャンネルと番組が挿入されます。 - ユーザーが少し右にスクロールすると、アプリは
onScrollイベントを受け取り、右側の次のページを照会する必要があると判断します。たとえば、このページは最初と同じ10チャンネルですが、午後2時の12時間後の午前2時から始まっているとします。Page-0-1がupdateDataに送信され、内部で、番組がデータストアの既存のチャンネルに追加されます。
updateFavorite
updateFavoriteメソッドの詳細については、お気に入りチャンネル機能のセクションを参照してください。
updateGridStartTime(gridStartTimeMs: number)
この関数は、開始時刻、つまりグリッドに表示される最も早い時刻を設定します。最初は、開始時刻は現在の時刻に設定され、最も近い30分間隔に四捨五入されます。開始時刻は静的で、自動的に更新されることはありません。代わりに、ユーザーはupdateGridStartTimeメソッドを使用して開始時刻を設定できます。この関数は、ミリ秒で表される時刻を受け取ります。入力時刻は30分の倍数(たとえば、2:00、2:30、3:00、3:30)にすることをお勧めします。updateGridStartTimeが経過すると、EPGコンポーネントは新しい開始時刻より前に終了した番組をすべて削除します。新しい時刻はグリッドの一番左端になります。
使用例
ここでは、ユーザーが午後2時にEPGアプリを開くシナリオを想定します。ユーザーが午後5時30分までこのアプリを開いたままにしたとすると、その後グリッドをナビゲートしたときに、「期限切れ」の番組が大量に表示されます。呼び出し側のアプリでタイマーを設定して、たとえば30分ごとにこのメソッドを呼び出せば、グリッドを自動的に更新させることができます。
データモデル
以下は、グリッドにコンテンツを入力するために呼び出し元から送信する必要のある、チャンネルデータと番組データの説明です。特定のフィールドは必須ですが、以下に示されているように、呼び出し元によって任意に設定される追加のフィールドも保持されます。呼び出し元アプリのコールバックで固有のメタデータを使用する必要がある場合は、このフィールドを通じてサポートされます。
例: 番組
interface Program {
programId: string;
title: string;
startTime: number;
endTime: number;
shortDescription?: string;
extras?: any;
}
例: チャンネル
interface Channel {
id: string;
displayName: string;
groupId: string;
groupName: string;
logoUrl: string;
programs: Program[];
extras?: any;
}
イベントコールバック
このセクションでは、呼び出し元がサブスクライブできる、EPGコンポーネントによって発行されるイベントについて説明します。必要なイベントハンドラーは、onTileFocusとonTilePressです。
onScroll: (event: EPGScrollEvent) => void;
このイベントは、スクロールアニメーションが終了したときに発生します。
例: ペイロード
{
"timeMs":1724131800000,
"row":1
}
onTileFocus: (event: EPGTileFocusEvent) => void;
このイベントは、ユーザーが特定のタイルのフォーカス状態を保持していることを表します。タイルにフォーカスのある状態が250ミリ秒間続くと、このイベントが発生します。
例: ペイロード
EPGFocusEventPayload {
program: Program;
channel: Channel;
nextProgramTitle?: string;
}
onTilePress: (event: EPGTilePressEvent) => void;
このイベントは、いずれかのタイルにフォーカスがある状態で選択ボタン(中央のボタン)が押されたときに発生します。
例: ペイロード
EPGPressEventPayload {
program: Program;
channel: Channel
}
onMenu: (event: EPGMenuEvent) => void;
このイベントは、メニューボタン(3本の水平線のボタン)が押されたときに発生します。
例: ペイロード
EPGMenuEventPayload {
program: Program;
channel: Channel
}
onMetricEmit: (event: EPGMetricsEmitEvent) => void;
このプロパティは、現時点ではプレースホルダーとなっている機能を表しています。将来のリリースでは、呼び出し元に関連する可能性のある指標が出力される予定です。このプロパティは省略できます。
例: ペイロード
EPGMetricsEmitEventPayload {
durationMs: number;
}
カスタムフォントのサポート
EPGはカスタムフォントをサポートしているため、EPG内のタイポグラフィを制御できます。フォントにはプライマリとセカンダリの2つの種類があり、両方を指定することも、1つだけ指定することもできます。セカンダリフォントはタイムラインバー(日付/時刻の文字列など)で使用され、プライマリフォントはその他の場所(主にタイル内)で使用されます。フォントは、アプリのassets/fontsディレクトリに配置します。
例: tileStyleプロパティでのプライマリとセカンダリのいずれかまたは両方の指定
<EPG
...
tileStyle={{
fontFamilyPrimary: 'Merriweather-Light',
fontFamilySecondary: 'Merriweather-Bold',
}}
/>
フォント名は正確に一致する必要があります。フォント名にスペースが含まれている場合は、プロパティ文字列にもスペースを含める必要があります。
Last updated: 2025年9月30日

