कास्ट विजेट को अपनी पसंद के मुताबिक बनाया जा सकता है. इसके लिए, रंग सेट करें, बटन, टेक्स्ट, और थंबनेल की स्टाइल बदलें, और दिखाने के लिए बटन के टाइप चुनें.
ऐप्लिकेशन की थीम को पसंद के मुताबिक बनाना
इस उदाहरण में, कस्टम थीम स्टाइल 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>
ऊपर दी गई आखिरी तीन लाइनों की मदद से, इस थीम के हिस्से के तौर पर, शुरुआती ओवरले, मिनी कंट्रोलर, और बड़े किए गए कंट्रोलर के लिए खास स्टाइल तय किए जा सकते हैं. उदाहरणों के लिए, नीचे दिए गए सेक्शन देखें.
कास्ट बटन को पसंद के मुताबिक बनाना
अपने ऐप्लिकेशन की थीम में कस्टम 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>
setTint
का इस्तेमाल तब किया जाना चाहिए, जब सहायता लाइब्रेरी का वर्शन 26.0.0 से नया हो. सहायता लाइब्रेरी के पुराने वर्शन के लिए, कृपया 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
में तीन स्लॉट होते हैं. इनमें एल्बम आर्ट और दो बटन दिख सकते हैं. अगर एल्बम आर्ट नहीं भरा गया है, तो तीन कंट्रोल बटन दिख सकते हैं.
SLOT SLOT SLOT
1 2 3
डिफ़ॉल्ट रूप से, फ़्रैगमेंट में 'चलाएं/रोकें' टॉगल बटन दिखता है. डेवलपर, castControlButtons
एट्रिब्यूट का इस्तेमाल करके यह तय कर सकते हैं कि कौनसे बटन दिखाने हैं.
काम करने वाले कंट्रोल बटन को आईडी रिसॉर्स के तौर पर परिभाषित किया गया है:
बटन प्रकार | ब्यौरा |
---|---|
@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">
चेतावनी: इस कलेक्शन में तीन आइटम होने चाहिए. ऐसा न होने पर, रनटाइम अपवाद दिखेगा. अगर आपको किसी स्लॉट में बटन नहीं दिखाना है, तो @id/cast_button_type_empty
का इस्तेमाल करें.
कस्टम बटन जोड़ना
MiniControllerFragment
, कस्टम कंट्रोल बटन जोड़ने की सुविधा देता है. ये बटन, SDK टूल से नहीं मिलते. जैसे, "पसंद करें" बटन. चरण इस प्रकार हैं:
MiniControllerFragment
केcastControlButtons
एट्रिब्यूट में@id/cast_button_type_custom
का इस्तेमाल करके, कस्टम बटन वाला स्लॉट तय करें.UIController
का सब-क्लास लागू करें.UIController
में ऐसे तरीके होते हैं जिन्हें एसडीके तब कॉल करता है, जब कास्ट सेशन या मीडिया सेशन की स्थिति में बदलाव होता है.UIController
के आपके सबक्लास में,ImageView
को पैरामीटर के तौर पर इस्तेमाल किया जाना चाहिए. साथ ही, ज़रूरत के हिसाब से इसकी स्थिति को अपडेट किया जाना चाहिए.सबक्लास
MiniControllerFragment
बनाएं. इसके बाद, उस कस्टम बटन के लिएImageView
पाने के लिए,onCreateView
को बदलें और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 ... } } // 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>
बटन चुनना
बड़े किए गए कंट्रोलर की गतिविधि में, कंट्रोल बटन दिखाने के लिए पांच स्लॉट होते हैं. बीच वाले स्लॉट में हमेशा 'चलाएं/रोकें' टॉगल बटन दिखता है. इसे कॉन्फ़िगर नहीं किया जा सकता. बचे हुए चार स्लॉट को, ईमेल भेजने वाले ऐप्लिकेशन से, बाईं से दाईं ओर कॉन्फ़िगर किया जा सकता है.
SLOT SLOT PLAY/PAUSE SLOT SLOT
1 2 BUTTON 3 4
डिफ़ॉल्ट रूप से, गतिविधि में बाईं से दाईं ओर इन चार स्लॉट में, सबटाइटल बटन, पिछले आइटम पर जाएं बटन, अगले आइटम पर जाएं बटन, और म्यूट करने के लिए टॉगल बटन दिखता है. डेवलपर, castControlButtons
एट्रिब्यूट का इस्तेमाल करके यह तय कर सकते हैं कि किन स्लॉट में कौनसे बटन दिखाने हैं. इस्तेमाल किए जा सकने वाले कंट्रोल बटन की सूची, आईडी रिसॉर्स के तौर पर दी गई है. ये मिनी कंट्रोलर बटन के लिए बटन टाइप से मेल खाते हैं.
यहां एक उदाहरण दिया गया है, जिसमें दूसरे स्लॉट में रीवाइंड बटन, तीसरे स्लॉट में स्किप फ़ॉरवर्ड बटन, और पहले और आखिरी स्लॉट को खाली रखा गया है:
// 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>
कलेक्शन में चार आइटम होने चाहिए. ऐसा न होने पर, रनटाइम एक्सप्शन दिखेगा. अगर आपको किसी स्लॉट में बटन नहीं दिखाना है, तो @id/cast_button_type_empty
का इस्तेमाल करें. CastContext
इस गतिविधि के लाइफ़साइकल और प्रज़ेंटेशन को मैनेज कर सकता है.
कस्टम बटन जोड़ना
ExpandedControllerActivity
, कस्टम कंट्रोल बटन जोड़ने की सुविधा देता है. ये बटन SDK में उपलब्ध नहीं होते. जैसे, "पसंद करें" बटन. चरण इस प्रकार हैं:
ExpandedControllerActivity
केcastControlButtons
एट्रिब्यूट में@id/cast_button_type_custom
का इस्तेमाल करके, कस्टम बटन वाला स्लॉट तय करें. इसके बाद, उस कस्टम बटन के लिएImageView
पाने के लिए,getButtonImageViewAt(int)
का इस्तेमाल किया जा सकता है.UIController
का सब-क्लास लागू करें.UIController
में ऐसे तरीके होते हैं जिन्हें कास्ट सेशन या मीडिया सेशन की स्थिति बदलने पर, SDK टूल कॉल करता है.UIController
के आपके सबक्लास में,ImageView
को पैरामीटर के तौर पर इस्तेमाल किया जाना चाहिए. साथ ही, ज़रूरत के हिसाब से इसकी स्थिति को अपडेट किया जाना चाहिए.ExpandedControllerActivity को सबक्लास के तौर पर इस्तेमाल करें. इसके बाद, बटन का व्यू ऑब्जेक्ट पाने के लिए,
onCreate
को बदलें औरgetButtonImageViewAt(int)
को कॉल करें. इसके बाद, व्यू को अपने कस्टमUIController
से जोड़ने के लिए,bindViewToUIController(View, 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); ... } }