Android TV開發(fā)之使用Leanback傳輸控件

Leanback androidx庫中具有新的播放控件薯蝎,可改善用戶體驗判哥。對于視頻應用献雅,傳輸控件transport controls支持使用前進/后退控件進行視頻拖動。拖動時塌计,屏幕上會顯示縮略圖來幫助瀏覽視頻挺身。
該庫中包含抽象類和開箱即用的實現(xiàn),可為開發(fā)者提供更精細的控制锌仅。使用預構建實現(xiàn)時章钾,您無需編寫大量代碼即可快速構建功能豐富的應用墙贱。如果需要進行更多自定義設置,您可以擴展該庫的任何預構建組件贱傀。

控件和播放器

Leanback 庫將帶有傳輸控件的界面與播放視頻的播放器分開惨撇。這是通過兩個組件實現(xiàn)的:用于顯示傳輸控件(或者視頻)的播放支持 playback support Fragment 和用于封裝媒體播放器的播放器適配器player adapter

Playback fragment

應用的界面 Activity 應使用 PlaybackSupportFragmentVideoSupportFragment府寒。兩者都包含 Leanback 傳輸控件:

  • PlaybackSupportFragment 將其傳輸控件制作成動畫魁衙,以根據(jù)需要隱藏/顯示這些控件。
  • VideoSupportFragment 擴展了 PlaybackSupportFragment 并具有用于渲染視頻的 SurfaceView株搔。
    您可以自定義 Fragment 的 ObjectAdapter剖淀,以改進界面。例如纤房,使用 setAdapter() 添加“相關視頻”行纵隔。

PlayerAdapter

PlayerAdapter 是一個用于控制底層媒體播放器的抽象類。開發(fā)者可以選擇預構建的 MediaPlayerAdapter 實現(xiàn)帆卓,也可以自己編寫該類的實現(xiàn)巨朦。

將片段粘合在一起(Glueing the pieces together)

您必須使用某種“控件粘合劑”將播放 Fragment 連接到播放器米丘。Leanback 庫提供兩種粘合劑:

  • PlaybackBannerControlGlue 使用“舊樣式”在播放 Fragment 中繪制傳輸控件剑令,并將控件放置在不透明背景中。(PlaybackBannerControlGlue 取代了已被棄用的 PlaybackControlGlue拄查。)
  • PlaybackTransportControlGlue 使用具有透明背景的“新樣式”控件吁津。
    glue_side_by_side.png

    如果您希望應用支持視頻拖動,必須使用 PlaybackTransportControlGlue堕扶。
    您還需要指定一個“粘合主機glue host”碍脏,將粘合劑綁定到播放 Fragment,在界面中繪制傳輸控件并保持其狀態(tài)稍算,然后將傳輸控制事件傳回粘合劑典尾。該主機必須與播放 Fragment 類型匹配。將 PlaybackSupportFragmentGlueHostPlaybackFragment 結合使用糊探,將 VideoSupportFragmentGlueHostVideoFragment 結合使用钾埂。
    下圖顯示了 Leanback 傳輸控件的各個片段如何粘合在一起:
    leanback-control-glue.png

將應用粘合在一起的代碼應該位于定義界面的 PlaybackSupportFragment 或 VideoSupportFragment 內。

在以下示例中科平,應用構建了一個名為 playerGlue 的 PlaybackTransportControlGlue 實例褥紫,并將其 VideoSupportFragment 連接到新創(chuàng)建的 MediaPlayerAdapter。由于這是一個 VideoSupportFragment瞪慧,設置代碼會調用 setHost() 以將 VideoSupportFragmentGlueHost 附加到 playerGlue髓考。該代碼包含在擴展 VideoSupportFragment 的類中。

    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氨菇,用于處理來自媒體播放器的事件儡炼。

自定義界面粘合劑

您可以自定義 PlaybackBannerControlGluePlaybackTransportControlGlue,用于更改 PlaybackControlsRow查蓉。

自定義標題和描述

如需自定義播放控件頂部的標題和描述射赛,請?zhí)鎿Q onCreateRowPresenter()

    @Override
    protected PlaybackRowPresenter onCreateRowPresenter() {
      PlaybackTransportRowPresenter presenter = (PlaybackTransportRowPresenter) super.onCreateRowPresenter();
      presenter.setDescriptionPresenter(new MyCustomDescriptionPresenter());
      return presenter;
    }

添加控件

控件粘合劑顯示 PlaybackControlsRow 中的操作控件。
PlaybackControlsRow 中的操作分為兩組:主要操作和次要操作奶是。主要操作組的控件顯示在搜索欄上方楣责,次要操作組的控件顯示在搜索欄下方。最初聂沙,播放/暫停按鈕只有一個主要操作秆麸,沒有次要操作。
您可以通過替換 onCreatePrimaryActions()onCreateSecondaryActions()及汉,向主要操作和次要操作添加操作沮趣。

    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() 才能處理新操作。

    @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.
    }

在特殊情況下坷随,您可能想要實現(xiàn)自己的 PlaybackTransportRowPresenter 以渲染自定義控件房铭,并使用 PlaybackSeekUi 以響應搜索操作。

視頻拖動

如果應用使用 VideoSupportFragment温眉,并且您希望支持視頻拖動缸匪。


leanback-scrubbing

您需要提供 PlaybackSeekDataProvider 的實現(xiàn)。該組件提供滾動時使用的視頻縮略圖类溢。您必須通過擴展 PlaybackSeekDataProvider 實現(xiàn)自己的提供程序凌蔬。請參閱 Android TV GitHub 代碼庫中的 Android Leanback Showcase 示例應用中的示例。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末闯冷,一起剝皮案震驚了整個濱河市砂心,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛇耀,老刑警劉巖辩诞,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纺涤,居然都是意外死亡译暂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門洒琢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秧秉,“玉大人,你說我怎么就攤上這事衰抑∠笥” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砾淌。 經(jīng)常有香客問我啦撮,道長,這世上最難降的妖魔是什么汪厨? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任赃春,我火速辦了婚禮,結果婚禮上劫乱,老公的妹妹穿的比我還像新娘织中。我一直安慰自己,他們只是感情好衷戈,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布狭吼。 她就那樣靜靜地躺著,像睡著了一般殖妇。 火紅的嫁衣襯著肌膚如雪刁笙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天谦趣,我揣著相機與錄音疲吸,去河邊找鬼。 笑死前鹅,一個胖子當著我的面吹牛摘悴,可吹牛的內容都是我干的。 我是一名探鬼主播嫡纠,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烦租,長吁一口氣:“原來是場噩夢啊……” “哼延赌!你這毒婦竟也來了除盏?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤挫以,失蹤者是張志新(化名)和其女友劉穎者蠕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掐松,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡踱侣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了大磺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抡句。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杠愧,靈堂內的尸體忽然破棺而出待榔,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布锐锣,位于F島的核電站腌闯,受9級特大地震影響,放射性物質發(fā)生泄漏雕憔。R本人自食惡果不足惜姿骏,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斤彼。 院中可真熱鬧分瘦,春花似錦、人聲如沸琉苇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翁潘。三九已至趁冈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拜马,已是汗流浹背渗勘。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俩莽,地道東北人旺坠。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像扮超,于是被迫代替她去往敵國和親取刃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354