Leanback यूज़र इंटरफ़ेस (यूआई) टूलकिट में प्लेबैक कंट्रोल होते हैं, जो बेहतर उपयोगकर्ता अनुभव देते हैं. वीडियो ऐप्लिकेशन के लिए, ट्रांसपोर्ट कंट्रोल में वीडियो को आगे और पीछे ले जाने के कंट्रोल के साथ वीडियो को स्क्रेब करने की सुविधा काम करती है. डिसप्ले को स्क्रब करते समय ताकि एक से दूसरी जगह पर जाने में आसानी हो.
लाइब्रेरी में ऐब्सट्रैक्ट क्लास के साथ-साथ, पहले से तैयार, अलग तरीके से लागू की जाने वाली सुविधाएं शामिल हैं जो डेवलपर को ज़्यादा बारीकी से कंट्रोल करने की सुविधा देते हैं. पहले से बनी हुई ऐसेट का इस्तेमाल करना इसका इस्तेमाल करके, बिना कोडिंग के तेज़ी से सुविधाओं से भरा ऐप्लिकेशन बनाया जा सकता है. अगर आपको ज़्यादा कस्टमाइज़ेशन की ज़रूरत है, तो लाइब्रेरी के पहले से बने किसी भी कॉम्पोनेंट को बड़ा किया जा सकता है.
कंट्रोल और प्लेयर
Leanback यूज़र इंटरफ़ेस (यूआई) टूलकिट, परिवहन नियंत्रण यूज़र इंटरफ़ेस (यूआई) को इससे अलग करता है वह प्लेयर जो बैक वीडियो चलाता है. ऐसा दो कॉम्पोनेंट की मदद से किया जाता है: ट्रांसपोर्ट कंट्रोल (और वैकल्पिक रूप से वीडियो) दिखाने के लिए प्लेबैक के लिए सहायता वाला फ़्रैगमेंट और मीडिया प्लेयर को शामिल करने के लिए प्लेयर अडैप्टर.
प्लेबैक फ़्रैगमेंट
आपके ऐप्लिकेशन की यूज़र इंटरफ़ेस (यूआई) गतिविधि में,
PlaybackSupportFragment
या
VideoSupportFragment
.
दोनों में लीनबैक ट्रांसपोर्ट कंट्रोल शामिल हैं:
PlaybackSupportFragment
, ट्रांसपोर्ट कंट्रोल को ज़रूरत के हिसाब से छिपाने/दिखाने के लिए ऐनिमेट करता है.VideoSupportFragment
,PlaybackSupportFragment
को बड़ा करता है और वीडियो को रेंडर करने के लिएSurfaceView
का इस्तेमाल करता है.
यूज़र इंटरफ़ेस (यूआई) को बेहतर बनाने के लिए, किसी फ़्रैगमेंट के ObjectAdapter
को पसंद के मुताबिक बनाया जा सकता है. उदाहरण के लिए,
setAdapter()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
"मिलते-जुलते वीडियो" जोड़ने के लिए लाइन.
PlayerAdapter
PlayerAdapter
एक ऐब्स्ट्रैक्ट क्लास है,
मौजूद मीडिया प्लेयर को कंट्रोल करता है. डेवलपर चुन सकते हैं
पहले से बने MediaPlayerAdapter
को लागू करें या लिखें
इस क्लास को खुद लागू करने की सुविधा मिलती है.
टुकड़ों को एक साथ चिपकाना
आपको "कंट्रोल ग्लू" का इस्तेमाल करना होगा प्लेबैक फ़्रैगमेंट कनेक्ट करने के लिए प्लेयर तक सीमित नहीं है. लीनबैक लाइब्रेरी, दो तरह के ग्लू उपलब्ध कराती है:
PlaybackBannerControlGlue
, प्लेबैक फ़्रैगमेंट में ट्रांसपोर्ट कंट्रोल को "पुराने स्टाइल" में दिखाता है. साथ ही, उन्हें अपारदर्शी बैकग्राउंड में रखता है.PlaybackBannerControlGlue
PlaybackControlGlue
की जगह लेता है, जिसे अब रोक दिया गया है.)PlaybackTransportControlGlue
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है "नई शैली" का उपयोग किया गया है को कंट्रोल किया जा सकता है.
अगर आपको अपने ऐप्लिकेशन में वीडियो स्क्रबिंग की सुविधा चाहिए, तो आपको
PlaybackTransportControlGlue
.
आपको "ग्लू होस्ट" के बारे में भी बताना होगा वह
गोंद को प्लेबैक से बाइंड करता है
फ़्रैगमेंट, यूज़र इंटरफ़ेस में ट्रांसपोर्ट कंट्रोल बनाता है और उनकी स्थिति बनाए रखता है. साथ ही,
परिवहन नियंत्रण इवेंट को वापस ग्लू में पास कर देती है. होस्ट का, प्लेबैक फ़्रैगमेंट टाइप से मेल खाना ज़रूरी है. इस्तेमाल की जाने वाली चीज़ें
PlaybackSupportFragmentGlueHost
के साथ
PlaybackFragment
और
VideoSupportFragmentGlueHost
VideoFragment
.
यहां एक इलस्ट्रेशन दिया गया है, जिसमें दिखाया गया है कि लीनबैक ट्रांसपोर्ट कंट्रोल के अलग-अलग हिस्से एक साथ कैसे फ़िट होते हैं:
आपके ऐप्लिकेशन को एक साथ चिपकाने वाला कोड
PlaybackSupportFragment
या VideoSupportFragment
, जो यूज़र इंटरफ़ेस (यूआई) के बारे में बताता है.
निम्न में
उदाहरण के लिए, ऐप्लिकेशन PlaybackTransportControlGlue
का एक इंस्टेंस बनाता है,
इसका नाम playerGlue
है,
और इसके VideoSupportFragment
को नए बनाए गए MediaPlayerAdapter
से जोड़ता है. यह VideoSupportFragment
है, इसलिए सेटअप कोड playerGlue
से VideoSupportFragmentGlueHost
को अटैच करने के लिए setHost()
को कॉल करता है. यह कोड उस क्लास में शामिल होता है जो VideoSupportFragment
को एक्सटेंड़ करता है.
Kotlin
class MyVideoFragment : VideoSupportFragment() { fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) val playerGlue = PlaybackTransportControlGlue(getActivity(), MediaPlayerAdapter(getActivity())) playerGlue.setHost(VideoSupportFragmentGlueHost(this)) playerGlue.addPlayerCallback(object : PlaybackGlue.PlayerCallback() { override fun onPreparedStateChanged(glue: PlaybackGlue) { if (glue.isPrepared()) { playerGlue.seekProvider = MySeekProvider() playerGlue.play() } } }) playerGlue.setSubtitle("Leanback artist") playerGlue.setTitle("Leanback team at work") val uriPath = "android.resource://com.example.android.leanback/raw/video" playerGlue.getPlayerAdapter().setDataSource(Uri.parse(uriPath)) } }
Java
public class MyVideoFragment extends VideoSupportFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final PlaybackTransportControlGlue<MediaPlayerAdapter> playerGlue = new PlaybackTransportControlGlue(getActivity(), new MediaPlayerAdapter(getActivity())); playerGlue.setHost(new VideoSupportFragmentGlueHost(this)); playerGlue.addPlayerCallback(new PlaybackGlue.PlayerCallback() { @Override public void onPreparedStateChanged(PlaybackGlue glue) { if (glue.isPrepared()) { playerGlue.setSeekProvider(new MySeekProvider()); playerGlue.play(); } } }); playerGlue.setSubtitle("Leanback artist"); playerGlue.setTitle("Leanback team at work"); String uriPath = "android.resource://com.example.android.leanback/raw/video"; playerGlue.getPlayerAdapter().setDataSource(Uri.parse(uriPath)); } }
ध्यान दें कि सेटअप कोड, इन इवेंट को मैनेज करने के लिए PlayerAdapter.Callback
के बारे में भी बताता है
मीडिया प्लेयर पर.
यूज़र इंटरफ़ेस (यूआई) ग्लू को पसंद के मुताबिक बनाना
PlaybackControlsRow
को बदलने के लिए, PlaybackBannerControlGlue
और PlaybackTransportControlGlue
को पसंद के मुताबिक बनाया जा सकता है.
टाइटल और ब्यौरे को पसंद के मुताबिक बनाना
वीडियो चलाने के कंट्रोल के सबसे ऊपर मौजूद टाइटल और ब्यौरे को पसंद के मुताबिक बनाने के लिए, onCreateRowPresenter()
को बदलें:
Kotlin
override fun onCreateRowPresenter(): PlaybackRowPresenter { return super.onCreateRowPresenter().apply { (this as? PlaybackTransportRowPresenter) ?.setDescriptionPresenter(MyCustomDescriptionPresenter()) } }
Java
@Override protected PlaybackRowPresenter onCreateRowPresenter() { PlaybackTransportRowPresenter presenter = (PlaybackTransportRowPresenter) super.onCreateRowPresenter(); presenter.setDescriptionPresenter(new MyCustomDescriptionPresenter()); return presenter; }
कंट्रोल जोड़े जा रहे हैं
कंट्रोल ग्लू, PlaybackControlsRow
में कार्रवाइयों के लिए कंट्रोल दिखाता है.
PlaybackControlsRow
में की जाने वाली कार्रवाइयां
दो ग्रुप को असाइन किए जाते हैं: प्राइमरी ऐक्शन और सेकंडरी ऐक्शन
कार्रवाइयां. प्राइमरी ग्रुप के लिए कंट्रोल, सीक (आगे/पीछे ले जाने वाला) बार के ऊपर दिखते हैं. साथ ही,
सेकंडरी ग्रुप, सीक (आगे/पीछे ले जाने वाला) बार के नीचे दिखता है. शुरुआत में, चलाएं/रोकें बटन के लिए सिर्फ़ एक प्राइमरी ऐक्शन होता है और कोई सेकंडरी ऐक्शन नहीं होता.
onCreatePrimaryActions()
और
onCreateSecondaryActions()
को बदलकर, प्राइमरी और सेकंडरी ग्रुप में कार्रवाइयां जोड़ी जा सकती हैं.
Kotlin
private lateinit var repeatAction: PlaybackControlsRow.RepeatAction private lateinit var pipAction: PlaybackControlsRow.PictureInPictureAction private lateinit var thumbsUpAction: PlaybackControlsRow.ThumbsUpAction private lateinit var thumbsDownAction: PlaybackControlsRow.ThumbsDownAction private lateinit var skipPreviousAction: PlaybackControlsRow.SkipPreviousAction private lateinit var skipNextAction: PlaybackControlsRow.SkipNextAction private lateinit var fastForwardAction: PlaybackControlsRow.FastForwardAction private lateinit var rewindAction: PlaybackControlsRow.RewindAction override fun onCreatePrimaryActions(primaryActionsAdapter: ArrayObjectAdapter) { // Order matters, super.onCreatePrimaryActions() will create the play / pause action. // Will display as follows: // play/pause, previous, rewind, fast forward, next // > /|| |< << >> >| super.onCreatePrimaryActions(primaryActionsAdapter) primaryActionsAdapter.apply { add(skipPreviousAction) add(rewindAction) add(fastForwardAction) add(skipNextAction) } } override fun onCreateSecondaryActions(adapter: ArrayObjectAdapter?) { super.onCreateSecondaryActions(adapter) adapter?.apply { add(thumbsDownAction) add(thumbsUpAction) } }
Java
private PlaybackControlsRow.RepeatAction repeatAction; private PlaybackControlsRow.PictureInPictureAction pipAction; private PlaybackControlsRow.ThumbsUpAction thumbsUpAction; private PlaybackControlsRow.ThumbsDownAction thumbsDownAction; private PlaybackControlsRow.SkipPreviousAction skipPreviousAction; private PlaybackControlsRow.SkipNextAction skipNextAction; private PlaybackControlsRow.FastForwardAction fastForwardAction; private PlaybackControlsRow.RewindAction rewindAction; @Override protected void onCreatePrimaryActions(ArrayObjectAdapter primaryActionsAdapter) { // Order matters, super.onCreatePrimaryActions() will create the play / pause action. // Will display as follows: // play/pause, previous, rewind, fast forward, next // > /|| |< << >> >| super.onCreatePrimaryActions(primaryActionsAdapter); primaryActionsAdapter.add(skipPreviousAction); primaryActionsAdapter.add(rewindAction); primaryActionsAdapter.add(fastForwardAction); primaryActionsAdapter.add(skipNextAction); } @Override protected void onCreateSecondaryActions(ArrayObjectAdapter adapter) { super.onCreateSecondaryActions(adapter); adapter.add(thumbsDownAction); adapter.add(thumbsUpAction); }
नई कार्रवाइयों को मैनेज करने के लिए, आपको onActionClicked()
को बदलना होगा.
Kotlin
override fun onActionClicked(action: Action) { when(action) { rewindAction -> { // Handle Rewind } fastForwardAction -> { // Handle FastForward } thumbsDownAction -> { // Handle ThumbsDown } thumbsUpAction -> { // Handle ThumbsUp } else -> // The superclass handles play/pause and delegates next/previous actions to abstract methods, // so those two methods should be overridden rather than handling the actions here. super.onActionClicked(action) } } override fun next() { // Skip to next item in playlist. } override fun previous() { // Skip to previous item in playlist. }
Java
@Override public void onActionClicked(Action action) { if (action == rewindAction) { // Handle Rewind } else if (action == fastForwardAction ) { // Handle FastForward } else if (action == thumbsDownAction) { // Handle ThumbsDown } else if (action == thumbsUpAction) { // Handle ThumbsUp } else { // The superclass handles play/pause and delegates next/previous actions to abstract methods, // so those two methods should be overridden rather than handling the actions here. super.onActionClicked(action); } } @Override public void next() { // Skip to next item in playlist. } @Override public void previous() { // Skip to previous item in playlist. }
खास मामलों में, हो सकता है कि आप
PlaybackTransportRowPresenter
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
कस्टम कंट्रोल रेंडर करने और
PlaybackSeekUi
.
वीडियो स्क्रबिंग
अगर आपका ऐप्लिकेशन VideoSupportFragment
का इस्तेमाल करता है और आपको वीडियो को आगे-पीछे करने की सुविधा देनी है.
आपने लोगों तक पहुंचाया मुफ़्त में
PlaybackSeekDataProvider
को लागू करने की सुविधा देनी होगी.
यह कॉम्पोनेंट स्क्रोल करते समय इस्तेमाल किए जाने वाले वीडियो थंबनेल उपलब्ध कराता है.
आपको PlaybackSeekDataProvider
को बढ़ाकर, अपने प्रॉवाइडर को लागू करना होगा.
इसका उदाहरण यहां देखें:
आराम से शोकेस ऐप्लिकेशन.
को अपनाएं.