[譯]playbackOverlayActivity 和 PlaybackOverlayFragment--Android TV 應(yīng)用開(kāi)發(fā)教程七

版權(quán)聲明:本文為博主原創(chuàng)翻譯文章,轉(zhuǎn)載請(qǐng)注明出處报腔。

推薦:
歡迎關(guān)注我創(chuàng)建的Android TV 簡(jiǎn)書(shū)專(zhuān)題株搔,會(huì)定期給大家分享一些AndroidTv相關(guān)的內(nèi)容:
http://www.reibang.com/c/3f0ab61a1322


PlaybackOverview1

本章僅介紹UI部分,下一章將介紹視頻控制。我們將實(shí)現(xiàn)用于處理視頻內(nèi)容的UI翻诉。

PlaybackOverlayActivity&PlaybackOverlayFragment

創(chuàng)建PlaybackOverlayActivity&PlaybackOverlayFragment與以前介紹的相同炮姨。

創(chuàng)建PlaybackOverlayActivity

New → Activity → BlankActivity
Activity 名稱(chēng): PlaybackOverlayActivity
Layout 名稱(chēng): activity_playback_overlay

此PlaybackOverlayActivity將在res / layout文件夾中引用activity_playback_overlay.xml文件。 它包含2層:視圖- 后面的VideoView和前面的PlaybackOverlayFragment舒岸。 VideoView是我們將播放視頻內(nèi)容的視圖绅作,PlaybackOverlayFragment將顯示用于控制視頻的UI洪乍,我們將在本章中重點(diǎn)介紹壳澳。 activity_playback_overlay.xml編寫(xiě)如下:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <VideoView android:id="@+id/videoView" android:layout_width="match_parent"
        android:layout_alignParentRight="true" android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" android:layout_alignParentBottom="true"
        android:layout_height="match_parent" android:layout_gravity="center"
        android:layout_centerInParent="true"></VideoView>

    <fragment android:id="@+id/playback_controls_fragment"
        android:name="com.corochann.androidtvapptutorial.PlaybackOverlayFragment"
        android:layout_width="match_parent" android:layout_height="match_parent" />

</FrameLayout>

現(xiàn)在我們不需要對(duì)PlaybackOverlayActivity進(jìn)行修改岂贩。

PlaybackOverlayFragment

創(chuàng)建PlaybackOverlayFragment:New -> Java Class -> Name: PlaybackOverlayFragment
這個(gè)PlaybackOverlayFragment是android.support.v17.leanback.app.PlaybackOverlayFragment的子類(lèi),它為我們提供了構(gòu)建視頻控制UI的組件巷波。
它與VideoDetailsFragment非常相似萎津,因此在適配器中設(shè)置行后,您只需要調(diào)用setAdapter(adapter)即可褥紫。 對(duì)于PlaybackOverlayFragment姜性,我們需要將顯示視頻控制UI的“PlaybackControlsRow”的實(shí)例設(shè)置為適配器的第一行元素。


PlaybackOverview

我們來(lái)研究“PlaybackControlsRow”及其 Presenter,“PlaybackControlsRowPresenter”髓考。 我們需要在每個(gè)實(shí)例中指定以下內(nèi)容部念。

  • PlaybackControlsRow
    PrimaryActionsAdapter - 它擁有主列的圖標(biāo)
    SecondaryActionsAdapter - 它擁有子行的圖標(biāo)

    請(qǐng)注意,PlaybackControlsRow類(lèi)為我們提供了許多有用的視頻控制默認(rèn)圖標(biāo)氨菇。 我們只需要實(shí)例化它的內(nèi)部類(lèi)儡炼。

  • PlaybackControlsRowPresenter
    DescriptionPresenter - 它是Presenter用于在PrimaryActions欄頂部顯示項(xiàng)目詳細(xì)信息。


    PlaybackOverview2

    上圖解釋了PlaybackControlsRow的內(nèi)部構(gòu)造 - PlaybackControlsRowpresenter查蓉。 PlaybackControlsRowPresenter的構(gòu)造器接受DescriptionPresenter對(duì)象的參數(shù)乌询,該對(duì)象決定了如何顯示視頻細(xì)節(jié)。 這一次豌研,我們將重用DetailsDescriptionPresenter妹田,我們?cè)谏弦徽轮薪o出了在DetailsFragment中顯示項(xiàng)目詳細(xì)信息。 PlaybackControlsRow有2行內(nèi)部設(shè)置動(dòng)作鹃共,PrimaryActionsAdapter和SecondaryActionsAdapter鬼佣。 我們可以在這些actionadapters中設(shè)置“動(dòng)作”圖標(biāo)。 有關(guān)可用操作和這些圖標(biāo)霜浴,請(qǐng)參閱上述照片晶衷。
    PlaybackOverlayFragment的示例實(shí)現(xiàn)如下。

package com.corochann.androidtvapptutorial;

import android.content.Context;
import android.os.Bundle;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ClassPresenterSelector;
import android.support.v17.leanback.widget.ControlButtonPresenterSelector;
import android.support.v17.leanback.widget.HeaderItem;
import android.support.v17.leanback.widget.ListRow;
import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.PlaybackControlsRow;
import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
import android.util.Log;

public class PlaybackOverlayFragment extends android.support.v17.leanback.app.PlaybackOverlayFragment {

    private static final String TAG = PlaybackOverlayFragment.class.getSimpleName();

    private Movie mSelectedMovie;
    private PlaybackControlsRow mPlaybackControlsRow;
    private ArrayObjectAdapter mPrimaryActionAdapter;
    private ArrayObjectAdapter mSecondaryActionAdapter;

    private PlaybackControlsRow.PlayPauseAction mPlayPauseAction;
    private PlaybackControlsRow.RepeatAction mRepeatAction;
    private PlaybackControlsRow.ThumbsUpAction mThumbsUpAction;
    private PlaybackControlsRow.ThumbsDownAction mThumbsDownAction;
    private PlaybackControlsRow.ShuffleAction mShuffleAction;
    private PlaybackControlsRow.SkipNextAction mSkipNextAction;
    private PlaybackControlsRow.SkipPreviousAction mSkipPreviousAction;
    private PlaybackControlsRow.FastForwardAction mFastForwardAction;
    private PlaybackControlsRow.RewindAction mRewindAction;
    private PlaybackControlsRow.HighQualityAction mHighQualityAction;
    private PlaybackControlsRow.ClosedCaptioningAction mClosedCaptioningAction;
    private PlaybackControlsRow.MoreActions mMoreActions;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "onCreate");
        super.onCreate(savedInstanceState);

        mSelectedMovie = (Movie) getActivity().getIntent().getSerializableExtra(DetailsActivity.MOVIE);

        setBackgroundType(PlaybackOverlayFragment.BG_LIGHT);
        setFadingEnabled(true);

        setUpRows();
    }

    private ArrayObjectAdapter mRowsAdapter;

    private void setUpRows() {
        ClassPresenterSelector ps = new ClassPresenterSelector();

        PlaybackControlsRowPresenter playbackControlsRowPresenter;
        playbackControlsRowPresenter = new PlaybackControlsRowPresenter(new DetailsDescriptionPresenter());

        ps.addClassPresenter(PlaybackControlsRow.class, playbackControlsRowPresenter);
        ps.addClassPresenter(ListRow.class, new ListRowPresenter());
        mRowsAdapter = new ArrayObjectAdapter(ps);

        /*
         * Add PlaybackControlsRow to mRowsAdapter, which makes video control UI.
         * PlaybackControlsRow is supposed to be first Row of mRowsAdapter.
         */
        addPlaybackControlsRow();
        /* add ListRow to second row of mRowsAdapter */
        addOtherRows();

        setAdapter(mRowsAdapter);

    }

    private void addPlaybackControlsRow() {
        mPlaybackControlsRow = new PlaybackControlsRow(mSelectedMovie);
        mRowsAdapter.add(mPlaybackControlsRow);

        ControlButtonPresenterSelector presenterSelector = new ControlButtonPresenterSelector();
        mPrimaryActionsAdapter = new ArrayObjectAdapter(presenterSelector);
        mSecondaryActionsAdapter = new ArrayObjectAdapter(presenterSelector);
        mPlaybackControlsRow.setPrimaryActionsAdapter(mPrimaryActionsAdapter);
        mPlaybackControlsRow.setSecondaryActionsAdapter(mSecondaryActionsAdapter);
        
        Activity activity = getActivity();
        mPlayPauseAction = new PlaybackControlsRow.PlayPauseAction(activity);
        mRepeatAction = new PlaybackControlsRow.RepeatAction(activity);
        mThumbsUpAction = new PlaybackControlsRow.ThumbsUpAction(activity);
        mThumbsDownAction = new PlaybackControlsRow.ThumbsDownAction(activity);
        mShuffleAction = new PlaybackControlsRow.ShuffleAction(activity);
        mSkipNextAction = new PlaybackControlsRow.SkipNextAction(activity);
        mSkipPreviousAction = new PlaybackControlsRow.SkipPreviousAction(activity);
        mFastForwardAction = new PlaybackControlsRow.FastForwardAction(activity);
        mRewindAction = new PlaybackControlsRow.RewindAction(activity);
        mHighQualityAction = new PlaybackControlsRow.HighQualityAction(activity);
        mClosedCaptioningAction = new PlaybackControlsRow.ClosedCaptioningAction(activity);
        mMoreActions = new PlaybackControlsRow.MoreActions(activity);

        /* PrimaryAction setting */
        mPrimaryActionsAdapter.add(mSkipPreviousAction);
        mPrimaryActionsAdapter.add(mRewindAction);
        mPrimaryActionsAdapter.add(mPlayPauseAction);
        mPrimaryActionsAdapter.add(mFastForwardAction);
        mPrimaryActionsAdapter.add(mSkipNextAction);

        /* SecondaryAction setting */
        mSecondaryActionsAdapter.add(mThumbsUpAction);
        mSecondaryActionsAdapter.add(mThumbsDownAction);
        mSecondaryActionsAdapter.add(mRepeatAction);
        mSecondaryActionsAdapter.add(mShuffleAction);
        mSecondaryActionsAdapter.add(mHighQualityAction);
        mSecondaryActionsAdapter.add(mClosedCaptioningAction);
        mSecondaryActionsAdapter.add(mMoreActions);
    }

    private void addOtherRows() {
        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
        Movie movie = new Movie();
        movie.setTitle("Title");
        movie.setStudio("studio");
        movie.setDescription("description");
        movie.setCardImageUrl("http://heimkehrend.raindrop.jp/kl-hacker/wp-content/uploads/2014/08/DSC02580.jpg");
        listRowAdapter.add(movie);
        listRowAdapter.add(movie);

        HeaderItem header = new HeaderItem(0, "OtherRows");
        mRowsAdapter.add(new ListRow(header, listRowAdapter));
    }

}

背景VideoView尚未實(shí)現(xiàn),黑色晌纫。 但是我們可以看到視頻控制UI已經(jīng)完成了税迷!

源代碼在github上。下一篇來(lái)介紹控制類(lèi)具體實(shí)現(xiàn):視頻控制最小化實(shí)現(xiàn) – Android TV 應(yīng)用開(kāi)發(fā)教程八

我將在下一章繼續(xù)使用這個(gè)UI實(shí)現(xiàn)視頻控件锹漱。
關(guān)注微信公眾號(hào)箭养,定期為你推薦移動(dòng)開(kāi)發(fā)相關(guān)文章。


songwenju
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凌蔬,一起剝皮案震驚了整個(gè)濱河市露懒,隨后出現(xiàn)的幾起案子闯冷,更是在濱河造成了極大的恐慌砂心,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛇耀,死亡現(xiàn)場(chǎng)離奇詭異辩诞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纺涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)译暂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人撩炊,你說(shuō)我怎么就攤上這事外永。” “怎么了拧咳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵伯顶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我骆膝,道長(zhǎng)祭衩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任阅签,我火速辦了婚禮掐暮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘政钟。我一直安慰自己路克,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布养交。 她就那樣靜靜地躺著精算,像睡著了一般。 火紅的嫁衣襯著肌膚如雪层坠。 梳的紋絲不亂的頭發(fā)上殖妇,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音破花,去河邊找鬼谦趣。 笑死疲吸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的前鹅。 我是一名探鬼主播摘悴,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舰绘!你這毒婦竟也來(lái)了蹂喻?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捂寿,失蹤者是張志新(化名)和其女友劉穎口四,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秦陋,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔓彩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驳概。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赤嚼。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖顺又,靈堂內(nèi)的尸體忽然破棺而出更卒,到底是詐尸還是另有隱情,我是刑警寧澤稚照,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布蹂空,位于F島的核電站,受9級(jí)特大地震影響锐锣,放射性物質(zhì)發(fā)生泄漏腌闯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一雕憔、第九天 我趴在偏房一處隱蔽的房頂上張望姿骏。 院中可真熱鬧,春花似錦斤彼、人聲如沸分瘦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘲玫。三九已至,卻和暖如春并扇,著一層夾襖步出監(jiān)牢的瞬間去团,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留土陪,地道東北人昼汗。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鬼雀,于是被迫代替她去往敵國(guó)和親顷窒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評(píng)論 25 707
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程源哩,因...
    小菜c閱讀 6,444評(píng)論 0 17
  • 零秒思考的啟發(fā) 前陣子鞋吉,去看了場(chǎng)朋友演出的即興喜劇,這是一種沒(méi)有劇本励烦,沒(méi)有臺(tái)詞的小眾演出谓着,觀眾即興拋出幾個(gè)網(wǎng)絡(luò)金句...
    emma佳小佳閱讀 215評(píng)論 0 0
  • 1.曾經(jīng)帶著孩子到街上遛彎,遇到過(guò)這樣一幕:一位老人在街上當(dāng)街高聲吼一個(gè)5崩侠、6歲樣子的小女孩漆魔,這位老人估計(jì)是她的姥...
    家宴1314閱讀 281評(píng)論 0 0
  • 想去滑雪,就現(xiàn)在
    喜歡你拿我怎樣閱讀 147評(píng)論 0 0