キャスト ウィジェットをカスタマイズするには、色の設定、ボタン、テキスト、サムネイルの外観のスタイル設定、表示するボタンの種類の選択を行います。
アプリのテーマのカスタマイズ
この例では、カスタムカラー、導入用のオーバーレイ スタイル、ミニ コントローラ スタイル、拡張コントローラ スタイルを定義できるカスタムテーマ スタイル Theme.CastVideosTheme
を作成します。
<style name="Theme.CastVideosTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Set AppCompat's color theming attrs -->
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/accent</item>
<item name="android:textColorPrimary">@color/primary_text</item>
<item name="android:textColorSecondary">@color/secondary_text</item>
<item name="castIntroOverlayStyle">@style/CustomCastIntroOverlay</item>
<item name="castMiniControllerStyle">@style/CustomCastMiniController</item>
<item name="castExpandedControllerStyle">@style/CustomCastExpandedController</item>
</style>
上記の最後の 3 行では、このテーマの一部として、導入用のオーバーレイ、ミニ コントローラ、拡張コントローラに固有のスタイルを定義できます。以降のセクションに例を示します。
キャスト アイコンのカスタマイズ
アプリのテーマにカスタムの mediaRouteTheme
を追加するには:
<style name="Theme.CastVideosTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- ... -->
<item name="mediaRouteTheme">@style/CustomMediaRouterTheme</item>
</style>
カスタムのメディア ルーター テーマを宣言し、カスタムの mediaRouteButtonStyle
を宣言します。
<style name="CustomMediaRouterTheme" parent="Theme.MediaRouter">
<item name="mediaRouteButtonStyle">@style/CustomMediaRouteButtonStyle</item>
</style>
<style name="CustomMediaRouteButtonStyle" parent="Widget.MediaRouter.Light.MediaRouteButton">
<item name="mediaRouteButtonTint">#EEFF41</item>
</style>
サポート ライブラリのバージョンが 26.0.0 より新しい場合は、setTint
を使用する必要があります。サポート ライブラリの古いバージョンの場合は、代わりに buttonTint
を使用してください。
入門レベルのオーバーレイ テーマをカスタマイズする
IntroductoryOverlay
クラスは、アプリがカスタムテーマでオーバーライドできるさまざまなスタイル属性をサポートしています。以下の例は、オーバーレイ ウィジェットでボタンとタイトルの両方のテキストの外観をオーバーライドする方法を示しています。
<style name="CustomCastIntroOverlay" parent="CastIntroOverlay">
<item name="castButtonTextAppearance">@style/TextAppearance.CustomCastIntroOverlay.Button</item>
<item name="castTitleTextAppearance">@style/TextAppearance.CustomCastIntroOverlay.Title</item>
</style>
<style name="TextAppearance.CustomCastIntroOverlay.Button" parent="android:style/TextAppearance">
<item name="android:textColor">#FFFFFF</item>
</style>
<style name="TextAppearance.CustomCastIntroOverlay.Title"parent="android:style/TextAppearance.Large">
<item name="android:textColor">#FFFFFF</item>
</style>
ミニ コントローラをカスタマイズ
テーマのカスタマイズ
MiniControllerFragment
クラスは、アプリがカスタムテーマでオーバーライドできるさまざまなスタイル属性をサポートしています。この例では、サムネイル画像の表示を有効にする方法、小見出しと字幕の両方のテキスト表示のオーバーライド、色の設定、ボタンのカスタマイズを行う方法を示します。
<style name="CustomCastMiniController" parent="CastMiniController">
<item name="castShowImageThumbnail">true</item>
<item name="castTitleTextAppearance">@style/TextAppearance.AppCompat.Subhead</item>
<item name="castSubtitleTextAppearance">@style/TextAppearance.AppCompat.Caption</item>
<item name="castBackground">#FFFFFF</item>
<item name="castProgressBarColor">#FFFFFF</item>
<item name="castPlayButtonDrawable">@drawable/cast_ic_mini_controller_play</item>
<item name="castPauseButtonDrawable">@drawable/cast_ic_mini_controller_pause</item>
<item name="castStopButtonDrawable">@drawable/cast_ic_mini_controller_stop</item>
<item name="castLargePlayButtonDrawable">@drawable/cast_ic_mini_controller_play_large</item>
<item name="castLargePauseButtonDrawable">@drawable/cast_ic_mini_controller_pause_large</item>
<item name="castLargeStopButtonDrawable">@drawable/cast_ic_mini_controller_stop_large</item>
<item name="castSkipPreviousButtonDrawable">@drawable/cast_ic_mini_controller_skip_prev</item>
<item name="castSkipNextButtonDrawable">@drawable/cast_ic_mini_controller_skip_next</item>
<item name="castRewind30ButtonDrawable">@drawable/cast_ic_mini_controller_rewind30</item>
<item name="castForward30ButtonDrawable">@drawable/cast_ic_mini_controller_forward30</item>
<item name="castMuteToggleButtonDrawable">@drawable/cast_ic_mini_controller_mute</item>
<item name="castClosedCaptionsButtonDrawable">@drawable/cast_ic_mini_controller_closed_caption</item
</style>
ボタンを選択
MiniControllerFragment
には、アルバムアートを表示できる 3 つのスロットと 2 つのボタンがあります。アルバムアートにデータが入力されていない場合は、コントロール ボタンも 3 つあります。
SLOT SLOT SLOT
1 2 3
デフォルトでは、フラグメントには再生/一時停止の切り替えボタンが表示されます。デベロッパーは、castControlButtons
属性を使用して、表示するボタンをオーバーライドできます。サポートされているコントロール ボタンは、ID リソースとして定義されています。
ボタンのタイプ | 説明 |
---|---|
@id/cast_button_type_empty |
このスロットにはボタンを配置しないでください |
@id/cast_button_type_custom |
カスタムボタン |
@id/cast_button_type_play_pause_toggle |
再生と一時停止を切り替えます |
@id/cast_button_type_skip_previous |
キュー内の前のアイテムにスキップします |
@id/cast_button_type_skip_next |
キューの次の項目にスキップする |
@id/cast_button_type_rewind_30_seconds |
再生を 30 秒巻き戻します |
@id/cast_button_type_forward_30_seconds |
再生を 30 秒早送りします |
@id/cast_button_type_mute_toggle |
レシーバーのミュートとミュート解除を行います。 |
@id/cast_button_type_closed_caption |
テキスト トラックと音声トラックを選択するダイアログを開きます |
左から右に、アルバムアート、再生/一時停止切り替えボタン、早送りボタンを使用する例を次に示します。
<array name="cast_mini_controller_control_buttons">
<item>@id/cast_button_type_empty</item>
<item>@id/cast_button_type_play_pause_toggle</item>
<item>@id/cast_button_type_forward_30_seconds</item>
</array>
...
<fragment
android:id="@+id/cast_mini_controller"
...
app:castControlButtons="@array/cast_mini_controller_control_buttons"
class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment">
警告: この配列には必ず 3 つのアイテムを含める必要があります。そうしないと、ランタイム例外がスローされます。スロットにボタンを表示しない場合は、@id/cast_button_type_empty
を使用します。
カスタムボタンを追加する
MiniControllerFragment
は、「高評価」ボタンなど、SDK では提供されないカスタム コントロール ボタンの追加をサポートします。ステップは次のとおりです。
MiniControllerFragment
のcastControlButtons
属性で@id/cast_button_type_custom
を使用して、カスタムボタンを含めるスロットを指定します。UIController
のサブクラスを実装します。UIController
には、キャスト セッションまたはメディア セッションの状態が変更されたときに SDK が呼び出すメソッドが含まれています。UIController
のサブクラスは、パラメータの 1 つとしてImageView
を受け取り、必要に応じてその状態を更新する必要があります。MiniControllerFragment
をサブクラス化してから、onCreateView
をオーバーライドし、getButtonImageViewAt(int)
を呼び出して、そのカスタムボタンのImageView
を取得します。次に、bindViewToUIController(View, UIController)
を呼び出して、ビューをカスタムUIController
に関連付けます。カスタムボタンからアクションを処理する方法については、カスタム アクションを追加するの
MediaIntentReceiver
をご覧ください。次に、スロット 2 のボタンを
MyCustomUIController
というUIController
に関連付ける例を示します。
// arrays.xml
<array name="cast_expanded_controller_control_buttons">
<item>@id/cast_button_type_empty</item>
<item>@id/cast_button_type_rewind_30_seconds</item>
<item>@id/cast_button_type_custom</item>
<item>@id/cast_button_type_empty</item>
</array>
// MyCustomUIController.kt class MyCustomUIController(private val mView: View) : UIController() { override fun onMediaStatusUpdated() { // Update the state of mView based on the latest the media status. ... mView.visibility = View.INVISIBLE ... } } // MyMiniControllerFragment.kt class MyMiniControllerFragment : MiniControllerFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { super.onCreateView(inflater, container, savedInstanceState) val customButtonView = getButtonImageViewAt(2) val myCustomUiController = MyCustomUIController(customButtonView) uiMediaController.bindViewToUIController(customButtonView, myCustomUiController) ... } }
// MyCustomUIController.java class MyCustomUIController extends UIController { private final View mView; public MyCustomUIController(View view) { mView = view; } @Override public onMediaStatusUpdated() { // Update the state of mView based on the latest the media status. ... mView.setVisibility(View.INVISIBLE); ... } } // MyMiniControllerFragment.java class MyMiniControllerFragment extends MiniControllerFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); ImageView customButtonView = getButtonImageViewAt(2); MyCustomUIController myCustomUiController = new MyCustomUIController(customButtonView); getUIMediaController().bindViewToUIController(customButtonView, myCustomUiController); ... } }
拡張コントローラのカスタマイズ
テーマのカスタマイズ
拡張コントローラのアクティビティがダークモード ツールバーを使用している場合は、ツールバーで明るいテキストと明るいアイコンの色を使用するようにテーマを設定できます。
<style name="Theme.CastVideosTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="castExpandedControllerToolbarStyle">
@style/ThemeOverlay.AppCompat.Dark.ActionBar
</item>
</style>
展開されたコントローラにボタンの描画に使用する独自の画像を指定できます。
<style name="CustomCastExpandedController" parent="CastExpandedController">
<item name="castButtonColor">@null</item>
<item name="castPlayButtonDrawable">@drawable/cast_ic_expanded_controller_play</item>
<item name="castPauseButtonDrawable">@drawable/cast_ic_expanded_controller_pause</item>
<item name="castStopButtonDrawable">@drawable/cast_ic_expanded_controller_stop</item>
<item name="castSkipPreviousButtonDrawable">@drawable/cast_ic_expanded_controller_skip_previous</item>
<item name="castSkipNextButtonDrawable">@drawable/cast_ic_expanded_controller_skip_next</item>
<item name="castRewind30ButtonDrawable">@drawable/cast_ic_expanded_controller_rewind30</item>
<item name="castForward30ButtonDrawable">@drawable/cast_ic_expanded_controller_forward30</item>
</style>
ボタンを選択
拡張コントローラのアクティビティには、コントロール ボタンを表示するスロットが 5 つあります。中央のスロットには、常に再生/一時停止の切り替えボタンが表示されます。このボタンは変更できません。他の 4 つのスロットは、送信側アプリが左から右に構成できます。
SLOT SLOT PLAY/PAUSE SLOT SLOT
1 2 BUTTON 3 4
デフォルトでは、このアクティビティは左から右の 4 つのスロットに、字幕ボタン、前のアイテムへのスキップボタン、次のアイテムへのスキップボタン、ミュート切り替えボタンを表示します。デベロッパーは、castControlButtons
属性を使用して、どのスロットにどのボタンを表示するかをオーバーライドできます。サポートされているコントロール ボタンのリストは、ミニ コントローラ ボタンのボタンタイプと同じ ID リソースとして定義されています。
次の例では、2 番目のスロットに巻き戻しボタンを、3 番目のスロットに早送りボタンを配置し、最初と最後のスロットを空のままにしています。
// arrays.xml
<array name="cast_expanded_controller_control_buttons">
<item>@id/cast_button_type_empty</item>
<item>@id/cast_button_type_rewind_30_seconds</item>
<item>@id/cast_button_type_forward_30_seconds</item>
<item>@id/cast_button_type_empty</item>
</array>
...
// styles.xml
<style name="Theme.MyTheme">
<item name="castExpandedControllerStyle">
@style/CustomCastExpandedController
</item>
</style>
...
<style name="CustomCastExpandedController" parent="CastExpandedController">
<item name="castControlButtons">
@array/cast_expanded_controller_control_buttons
</item>
</style>
配列には正確に 4 つのアイテムが含まれている必要があります。含まれていない場合、ランタイム例外がスローされます。スロットにボタンを表示しない場合は、@id/cast_button_type_empty
を使用します。CastContext
は、このアクティビティのライフサイクルと表示を管理できます。
カスタムボタンを追加する
ExpandedControllerActivity
は、「高評価」ボタンなど、SDK では提供されていないカスタム コントロール ボタンの追加をサポートします。ステップは次のとおりです。
ExpandedControllerActivity
のcastControlButtons
属性で@id/cast_button_type_custom
を使用して、カスタムボタンを含めるスロットを指定します。その後、getButtonImageViewAt(int)
を使用して、そのカスタムボタンのImageView
を取得できます。UIController
のサブクラスを実装します。UIController
には、キャスト セッションまたはメディア セッションの状態が変更されたときに SDK が呼び出すメソッドが含まれています。UIController
のサブクラスは、パラメータの 1 つとしてImageView
を受け取り、必要に応じてその状態を更新する必要があります。ExpandedControllerActivity をサブクラス化し、
onCreate
をオーバーライドして、getButtonImageViewAt(int)
を呼び出して、ボタンのビュー オブジェクトを取得します。次に、bindViewToUIController(View, UIController)
を呼び出して、ビューをカスタムUIController
に関連付けます。カスタムボタンからアクションを処理する方法については、カスタム アクションを追加するの
MediaIntentReceiver
をご覧ください。
次に、スロット 2 のボタンを MyCustomUIController
という UIController
に関連付ける例を示します。
// arrays.xml
<array name="cast_expanded_controller_control_buttons">
<item>@id/cast_button_type_empty</item>
<item>@id/cast_button_type_rewind_30_seconds</item>
<item>@id/cast_button_type_custom</item>
<item>@id/cast_button_type_empty</item>
</array>
// MyCustomUIController.kt class MyCustomUIController(private val mView: View) : UIController() { override fun onMediaStatusUpdated() { // Update the state of mView based on the latest the media status. ... mView.visibility = View.INVISIBLE ... } } // MyExpandedControllerActivity.kt internal class MyExpandedControllerActivity : ExpandedControllerActivity() { public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val customButtonView = getButtonImageViewAt(2) val myCustomUiController = MyCustomUIController(customButtonView) uiMediaController.bindViewToUIController(customButtonView, myCustomUiController) ... } }
// MyCustomUIController.java class MyCustomUIController extends UIController { private final View mView; public MyCustomUIController(View view) { mView = view; } @Override public onMediaStatusUpdated() { // Update the state of mView based on the latest the media status. ... mView.setVisibility(View.INVISIBLE); ... } } // MyExpandedControllerActivity.java class MyExpandedControllerActivity extends ExpandedControllerActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ImageView customButtonView = getButtonImageViewAt(2); MyCustomUIController myCustomUiController = new MyCustomUIController(customButtonView); getUIMediaController().bindViewToUIController(customButtonView, myCustomUiController); ... } }