Android 創(chuàng)建目錄瀏覽器

2018-08-02 17:58 更新

編寫:huanglizhuo - 原文:http://developer.android.com/training/tv/playback/browse.html

在TV上運(yùn)行的 多媒體應(yīng)用得允許用戶瀏覽,選擇和播放它所提供的內(nèi)容。目錄瀏覽器的用戶體驗(yàn)要簡單和直觀,以及賞心悅目,引人入勝。

這節(jié)課討論如何使用的V17 Leanback庫提供的類來實(shí)現(xiàn)用戶界面,用于從您的應(yīng)用程序的媒體目錄瀏覽音樂或視頻。

創(chuàng)建一個(gè)目錄布局

leanback 類庫中的BrowseFragment允許您用最少的代碼創(chuàng)建一個(gè)用于按行瀏覽的主布局 ,下面的例子將演示如何創(chuàng)建包含BrowseFragment的布局

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

  <fragment
      android:name="android.support.v17.leanback.app.BrowseFragment"
      android:id="@+id/browse_fragment"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      />
</LinearLayout>

為了使 activity 工作,需要在布局中取回BrowseFragment的元素。使用這個(gè)類中的方法設(shè)置顯示參數(shù),如圖標(biāo),標(biāo)題,以及該類別是否可用。下面的代碼簡單的演示了怎樣設(shè)置BrowseFragment布局參數(shù):

public class BrowseMediaActivity extends Activity {

    public static final String TAG ="BrowseActivity";

    protected BrowseFragment mBrowseFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.browse_fragment);

        final FragmentManager fragmentManager = getFragmentManager();
        mBrowseFragment = (BrowseFragment) fragmentManager.findFragmentById(
                R.id.browse_fragment);

        // Set display parameters for the BrowseFragment
        mBrowseFragment.setHeadersState(BrowseFragment.HEADERS_ENABLED);
        mBrowseFragment.setTitle(getString(R.string.app_name));
        mBrowseFragment.setBadgeDrawable(getResources().getDrawable(
                R.drawable.ic_launcher));
        mBrowseFragment.setBrowseParams(params);

    }
}

顯示媒體列表

BrowseFragment允許您定義和使用 adapter 和presenter 定義顯示可瀏覽媒體內(nèi)容類別和媒體項(xiàng)目。Adapters 允許我們連接本地或網(wǎng)絡(luò)數(shù)據(jù)資源。Presenters操控的媒體項(xiàng)目的數(shù)據(jù),并提供布局信息在屏幕上顯示的項(xiàng)目。

下面的示例代碼演示了一個(gè)為顯示字符串?dāng)?shù)據(jù)的Presenters的實(shí)現(xiàn)

public class StringPresenter extends Presenter {
    private static final String TAG = "StringPresenter";

    public ViewHolder onCreateViewHolder(ViewGroup parent) {
        TextView textView = new TextView(parent.getContext());
        textView.setFocusable(true);
        textView.setFocusableInTouchMode(true);
        textView.setBackground(
                parent.getContext().getResources().getDrawable(R.drawable.text_bg));
        return new ViewHolder(textView);
    }

    public void onBindViewHolder(ViewHolder viewHolder, Object item) {
        ((TextView) viewHolder.view).setText(item.toString());
    }

    public void onUnbindViewHolder(ViewHolder viewHolder) {
        // no op
    }
}

當(dāng)我們已經(jīng)為我們的媒體項(xiàng)目構(gòu)建了一個(gè)Presenter類,我們可以為BrowseFragment建立并添加一個(gè)適配器并在屏幕上顯示這些媒體項(xiàng)目。下面的示例代碼演示了如何用StringPresenter類構(gòu)造一個(gè)類別和項(xiàng)目適配器:

private ArrayObjectAdapter mRowsAdapter;
private static final int NUM_ROWS = 4;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    buildRowsAdapter();
}

private void buildRowsAdapter() {
    mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());

    for (int i = 0; i < NUM_ROWS; ++i) {
        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
                new StringPresenter());
        listRowAdapter.add("Media Item 1");
        listRowAdapter.add("Media Item 2");
        listRowAdapter.add("Media Item 3");
        HeaderItem header = new HeaderItem(i, "Category " + i, null);
        mRowsAdapter.add(new ListRow(header, listRowAdapter));
    }

    mBrowseFragment.setAdapter(mRowsAdapter);
}

這個(gè)例子顯示了靜態(tài)實(shí)現(xiàn)適配器。典型的媒體瀏覽器使用網(wǎng)絡(luò)數(shù)據(jù)庫或網(wǎng)絡(luò)服務(wù)。使用從網(wǎng)絡(luò)取回的數(shù)據(jù)做的媒體瀏覽器,參看例子Android TV

更新背景

為了給媒體瀏覽應(yīng)用增加視覺趣味,我們可以在用戶瀏覽的內(nèi)容時(shí)更新背景圖片。這種技術(shù)可以讓我們的應(yīng)用程序的互動(dòng)感倍增。

Leanback庫提供了BackgroundManager類為我們的TV應(yīng)用的activity更換背景。下面的例子演示了如何創(chuàng)建一個(gè)簡單的方法更換背景:

protected void updateBackground(Drawable drawable) {
    BackgroundManager.getInstance(this).setDrawable(drawable);
}

許多現(xiàn)有的媒體瀏覽應(yīng)用在用戶瀏覽媒體列表自動(dòng)更新的背景。為了做到這一點(diǎn),我們可以設(shè)置一個(gè)選擇監(jiān)聽器,根據(jù)用戶的當(dāng)前選擇自動(dòng)更新背景。下面的例子演示了如何建立一個(gè)OnItemViewSelectedListener監(jiān)聽選擇事件并更新背景:

protected void clearBackground() {
    BackgroundManager.getInstance(this).setDrawable(mDefaultBackground);
}

protected OnItemViewSelectedListener getDefaultItemViewSelectedListener() {
    return new OnItemViewSelectedListener() {
        @Override
        public void onItemSelected(Object item, Row row) {
            if (item instanceof Movie ) {
                URI uri = ((Movie)item).getBackdropURI();
                updateBackground(uri);
            } else {
                clearBackground();
            }
        }
    };
}

注意:以上的示例是為了簡單。當(dāng)我們在自己的應(yīng)用程序創(chuàng)建這個(gè)功能,我們應(yīng)該考慮運(yùn)行在一個(gè)單獨(dú)的線程在后臺(tái)更新操作獲得更好的性能。此外,如果我們正計(jì)劃在用戶觸發(fā)項(xiàng)目滾動(dòng)時(shí)更新背景,考慮增加一個(gè)時(shí)延,直到用戶停止操作時(shí)再更新背景圖像。這樣可以避免過多的背景圖片的更新。


下一節(jié):提供一個(gè)卡片View >


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)