Renkleri ayarlayarak, düğmeleri, metni ve küçük resim görünümünü şekillendirerek ve görüntülenecek düğme türlerini seçerek Cast widget'larını özelleştirebilirsiniz.
Uygulama temasını özelleştirme
Bu örnekte, özel renkler, tanıtım amaçlı yer paylaşımı stili, mini kumanda stili ve genişletilmiş kumanda stili tanımlayabilen özel bir tema stili Theme.CastVideosTheme oluşturulur.
<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>
Yukarıdaki son üç satır, bu temanın bir parçası olarak tanıtım amaçlı yer paylaşımı, mini kumanda ve genişletilmiş kumandaya özgü stiller tanımlamanıza olanak tanır. Aşağıdaki bölümlerde örnekler verilmiştir.
Yayınla düğmesini özelleştirme
Uygulamanızın temasına özel mediaRouteTheme eklemek için:
<style name="Theme.CastVideosTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- ... -->
<item name="mediaRouteTheme">@style/CustomMediaRouterTheme</item>
</style>
Özel Media Router temanızı ve özel bir mediaRouteButtonStyle öğesini beyan edin:
<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>
Destek kitaplığı sürümü 26.0.0'dan yeniyse setTint kullanılmalıdır. Eski destek kitaplığı sürümleri için lütfen buttonTint kullanın.
Tanıtım Yer Paylaşımı Temasını Özelleştirme
IntroductoryOverlay sınıfı, uygulamanızın özel bir temada geçersiz kılabileceği çeşitli stil özelliklerini destekler. Bu örnekte, yer paylaşımı widget'ındaki hem düğmenin hem de başlığın metin görünümünün nasıl geçersiz kılınacağı gösterilmektedir:
<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>
Mini kumandayı özelleştirme
Temayı özelleştirin
MiniControllerFragment sınıfı, uygulamanızın özel bir temada geçersiz kılabileceği çeşitli stil özelliklerini destekler. Bu örnekte, küçük resmin görüntülenmesinin nasıl etkinleştirileceği, hem alt başlığın hem de altyazının metin görünümünün nasıl geçersiz kılınacağı, renklerin nasıl ayarlanacağı ve düğmelerin nasıl özelleştirileceği gösterilmektedir:
<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>
Düğmeleri seçin
MiniControllerFragment, albüm kapağını gösterebilen üç yuvaya ve iki düğmeye ya da albüm kapağı doldurulmamışsa üç kontrol düğmesine sahiptir.
SLOT SLOT SLOT
1 2 3
Varsayılan olarak, parça bir oynat/duraklat açma/kapatma düğmesi gösterir. Geliştiriciler, hangi düğmelerin gösterileceğini geçersiz kılmak için castControlButtons özelliğini kullanabilir.
Desteklenen kontrol düğmeleri kimlik kaynakları olarak tanımlanır:
| Düğme Türü | Açıklama |
|---|---|
@id/cast_button_type_empty |
Bu alana düğme yerleştirmeyin |
@id/cast_button_type_custom |
Özel düğme |
@id/cast_button_type_play_pause_toggle |
Oynatma ve duraklatma arasında geçiş yapar. |
@id/cast_button_type_skip_previous |
Sıradaki önceki öğeye atlar. |
@id/cast_button_type_skip_next |
Sıradaki bir sonraki öğeye atlar. |
@id/cast_button_type_rewind_30_seconds |
Oynatmayı 30 saniye geri sarar. |
@id/cast_button_type_forward_30_seconds |
Oynatmayı 30 saniye ileri sarar. |
@id/cast_button_type_mute_toggle |
Alıcının sesini kapatır ve açar. |
@id/cast_button_type_closed_caption |
Metin ve ses parçalarını seçmek için bir iletişim kutusu açar. |
Aşağıda, soldan sağa doğru albüm kapağı, oynatma/duraklatma açma/kapatma düğmesi ve ileri sarma düğmesinin kullanıldığı bir örnek verilmiştir:
<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">
Uyarı: Bu dizi tam olarak üç öğe içermelidir. Aksi takdirde çalışma zamanı istisnası oluşturulur. Bir yuvada düğme göstermek istemiyorsanız @id/cast_button_type_empty kullanın.
Özel düğmeler ekleme
MiniControllerFragment, SDK tarafından sağlanmayan özel kontrol düğmelerinin (ör. "beğen" düğmesi) eklenmesini destekler. Adımlar aşağıdaki gibidr:
MiniControllerFragmentöğesinincastControlButtonsözelliğinde@id/cast_button_type_customkullanarak özel düğme içerecek bir alan belirtin.UIControllersınıfının bir alt sınıfını uygulayın.UIController, yayın oturumunun veya medya oturumunun durumu değiştiğinde SDK tarafından çağrılan yöntemleri içerir.UIControlleralt sınıfınız, parametrelerden biri olarakImageViewalmalı ve durumunu gerektiği gibi güncellemelidir.MiniControllerFragmentalt sınıfını oluşturun, ardındanonCreateViewyöntemini geçersiz kılın ve özel düğme içinImageViewdeğerini almak üzeregetButtonImageViewAt(int)yöntemini çağırın. Ardından, görünümü özelUIControllerile ilişkilendirmek içinbindViewToUIController(View, UIController)yöntemini çağırın.Özel düğmenizden gelen işlemin nasıl işleneceğini öğrenmek için Özel İşlem Ekleme bölümündeki
MediaIntentReceiverbölümüne bakın.Aşağıda, 2. yuvadaki bir düğmeyi
MyCustomUIControlleradlı birUIControllerile ilişkilendirme örneği verilmiştir:
// 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); ... } }
Genişletilmiş kumandayı özelleştirme
Temayı özelleştirin
Genişletilmiş kumandanın etkinliği koyu tema araç çubuğu kullanıyorsa araç çubuğunda açık renkli metin ve açık renkli simge rengi kullanmak için bir tema ayarlayabilirsiniz:
<style name="Theme.CastVideosTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="castExpandedControllerToolbarStyle">
@style/ThemeOverlay.AppCompat.Dark.ActionBar
</item>
</style>
Genişletilmiş kumandadaki düğmeleri çizmek için kullanılan kendi resimlerinizi belirtebilirsiniz:
<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>
Düğmeleri seçin
Genişletilmiş kumandanın etkinliğinde, kontrol düğmelerini göstermek için beş alan bulunur. Ortadaki alan her zaman oynat/duraklat açma/kapatma düğmesini gösterir ve yapılandırılamaz. Diğer dört yuva, gönderen uygulama tarafından soldan sağa doğru yapılandırılabilir.
SLOT SLOT PLAY/PAUSE SLOT SLOT
1 2 BUTTON 3 4
Varsayılan olarak etkinlikte soldan sağa doğru şu dört düğme gösterilir: altyazı düğmesi, önceki öğeye atlama düğmesi, sonraki öğeye atlama düğmesi ve sesi kapatma düğmesi. Geliştiriciler, hangi düğmelerin hangi alanlarda gösterileceğini geçersiz kılmak için castControlButtons özelliğini kullanabilir. Desteklenen kontrol düğmelerinin listesi, mini kumanda düğmelerinin düğme türleriyle aynı kimlik kaynakları olarak tanımlanır.
Aşağıda, ikinci yuvaya geri sarma düğmesi, üçüncü yuvaya ileri sarma düğmesi yerleştiren ve birinci ile son yuvaları boş bırakan bir örnek verilmiştir:
// 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>
Dizi tam olarak dört öğe içermelidir. Aksi takdirde çalışma zamanı istisnası oluşturulur. Bir yuvada düğme göstermek istemiyorsanız @id/cast_button_type_empty kullanın. CastContext, bu etkinliğin yaşam döngüsünü ve sunumunu yönetebilir.
Özel düğmeler ekleme
ExpandedControllerActivity, SDK tarafından sağlanmayan özel kontrol düğmelerinin (ör. "beğen" düğmesi) eklenmesini destekler. Adımlar aşağıdaki gibidr:
ExpandedControllerActivityöğesinincastControlButtonsözelliğinde@id/cast_button_type_customkullanarak özel düğme içerecek bir alan belirtin. Ardından, bu özel düğmeninImageViewdeğerini almak içingetButtonImageViewAt(int)yöntemini kullanabilirsiniz.UIControllersınıfının bir alt sınıfını uygulayın.UIController, yayın oturumunun veya medya oturumunun durumu değiştiğinde SDK tarafından çağrılan yöntemleri içerir.UIControlleralt sınıfınız, parametrelerden biri olarakImageViewalmalı ve durumunu gerektiği gibi güncellemelidir.ExpandedControllerActivity'yi alt sınıf olarak belirleyin, ardından
onCreateöğesini geçersiz kılın ve düğmenin görünüm nesnesini almak içingetButtonImageViewAt(int)öğesini çağırın. Ardından, görünümü özelUIControllerile ilişkilendirmek içinbindViewToUIController(View, UIController)yöntemini çağırın.Özel düğmenizdeki işlemin nasıl yapılacağını öğrenmek için
MediaIntentReceiverbölümündeki Özel İşlem Ekleme başlığına bakın.
2. yuvadaki bir düğmeyi MyCustomUIController adlı bir UIController ile ilişkilendirme örneğini aşağıda görebilirsiniz:
// 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); ... } }