ערכת הכלים של ממשק המשתמש ל-Leanback כוללת פקדי הפעלה שמספקים גרסה משופרת חוויית המשתמש. עבור אפליקציות וידאו, פקדי ההעברה תומכים במעבר וידאו באמצעות הפקדים קדימה ואחורה. בזמן קרצוף על המסך תמונות ממוזערות כדי לסייע לנו לנווט בסרטון.
הספרייה כוללת מחלקות מופשטות וגם הטמעות מוכנות מראש שמספקים למפתחים שליטה מפורטת יותר. באמצעות של אפליקציות מתקדמות, אתם יכולים לפתח במהירות אפליקציה עשירה בתכונות בלי שתצטרכו להוסיף הרבה תכנות. אם דרושה לך התאמה אישית נוספת, אפשר להרחיב כל אחד מהתוספים המובנים מראש בספרייה רכיבים.
פקדים ונגן
ערכת הכלים לבניית ממשק משתמש ל-Leanback מפרידה בין ממשק המשתמש של בקרות התעבורה הנגן שמפעיל את הסרטון. ניתן לעשות זאת באמצעות שני רכיבים: קטע של תמיכת הפעלה להצגת פקדי התעבורה (ו את הסרטון) ומתאם לנגן כדי להכיל נגן מדיה.
קטע הפעלה
בפעילות בממשק המשתמש של האפליקציה צריך להשתמש ב-
PlaybackSupportFragment
או
VideoSupportFragment
.
שניהם כוללים את אמצעי הבקרה להעברות leanback:
PlaybackSupportFragment
עם אנימציה של פקדי התעבורה כדי להסתיר או להציג אותם לפי הצורך.VideoSupportFragment
מורחבPlaybackSupportFragment
ויש לוSurfaceView
לעיבוד וידאו.
ניתן להתאים אישית מקטע
ObjectAdapter
כדי לשפר את ממשק המשתמש. לדוגמה, השתמשו
setAdapter()
כדי להוסיף "סרטונים קשורים" השורה הראשונה.
PlayerAdapter
PlayerAdapter
הוא מחלקה מופשטת
שולט בנגן המדיה הבסיסי. מפתחים יכולים לבחור
את ההטמעה של MediaPlayerAdapter
שהוגדרה מראש, או לכתוב
את השימוש שלהם בכיתה הזו.
הדבקה של החלקים
צריך להשתמש בדבק בקרה כדי לחבר את מקטע ההפעלה לנגן. פשוט היא מספקת שני סוגים של דבקים:
PlaybackBannerControlGlue
תיקו את בקרי העברה בקטע ההפעלה ב"סגנון הישן", והצבתם בתוך רקע אטום. (PlaybackBannerControlGlue
) מחליפה אתPlaybackControlGlue
, שהוצא משימוש.)PlaybackTransportControlGlue
משתמש ב"סגנון חדש" עם רקע שקוף.
אם ברצונך שהאפליקציה שלך תתמוך בהקפצת סרטונים, עליך להשתמש
PlaybackTransportControlGlue
צריך גם לציין 'מארח דבק' ש
מקשרת את הדבק להפעלה
מקטע, מצייר את פקדי התעבורה בממשק המשתמש ושומר על המצב שלהם,
מעבירה בחזרה את אירועי בקרת ההובלה לדבק. המארח חייב להתאים לסוג המקטע בהפעלה. כדאי להשתמש
PlaybackSupportFragmentGlueHost
עם
PlaybackFragment
, וגם
VideoSupportFragmentGlueHost
עם
VideoFragment
באיור הבא מוצג האופן שבו החלקים של אמצעי בקרת ההובלה leanback מתאימים:
הקוד שמדביק את האפליקציה צריך להיות בתוך
PlaybackSupportFragment
או VideoSupportFragment
שמגדירים את ממשק המשתמש.
בתוך
לדוגמה, האפליקציה יוצרת מופע של PlaybackTransportControlGlue
,
ונותן לו את השם playerGlue
,
ומחבר את VideoSupportFragment
שלו ל-MediaPlayerAdapter
שנוצר לאחרונה. מאז
זהו VideoSupportFragment
, שקוד ההגדרה קורא ל-setHost()
כדי לצרף
VideoSupportFragmentGlueHost
עד playerGlue
. הקוד נכלל בתוך הכיתה
שמרחיבים את 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
לטיפול באירועים מ:
נגן המדיה.
התאמה אישית של הדבק בממשק המשתמש
אפשר להתאים אישית
PlaybackBannerControlGlue
וגם PlaybackTransportControlGlue
כדי לשנות את
PlaybackControlsRow
.
התאמה אישית של השם והתיאור
כדי להתאים אישית את השם והתיאור בחלק העליון של
פקדי הפעלה, לשנות
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
אפשר לראות את הדוגמה
אפליקציית Leanback Showcase
הקצר הזה. התשובות שלך יעזרו לנו להשתפר.