W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
編寫:huanglizhuo - 原文:http://developer.android.com/training/tv/playback/browse.html
在TV上運行的 多媒體應用得允許用戶瀏覽,選擇和播放它所提供的內(nèi)容。目錄瀏覽器的用戶體驗要簡單和直觀,以及賞心悅目,引人入勝。
這節(jié)課討論如何使用的V17 Leanback庫提供的類來實現(xiàn)用戶界面,用于從您的應用程序的媒體目錄瀏覽音樂或視頻。
leanback 類庫中的BrowseFragment允許您用最少的代碼創(chuàng)建一個用于按行瀏覽的主布局 ,下面的例子將演示如何創(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的元素。使用這個類中的方法設(shè)置顯示參數(shù),如圖標,標題,以及該類別是否可用。下面的代碼簡單的演示了怎樣設(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)容類別和媒體項目。Adapters 允許我們連接本地或網(wǎng)絡(luò)數(shù)據(jù)資源。Presenters操控的媒體項目的數(shù)據(jù),并提供布局信息在屏幕上顯示的項目。
下面的示例代碼演示了一個為顯示字符串數(shù)據(jù)的Presenters的實現(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
}
}
當我們已經(jīng)為我們的媒體項目構(gòu)建了一個Presenter類,我們可以為BrowseFragment建立并添加一個適配器并在屏幕上顯示這些媒體項目。下面的示例代碼演示了如何用StringPresenter類構(gòu)造一個類別和項目適配器:
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);
}
這個例子顯示了靜態(tài)實現(xiàn)適配器。典型的媒體瀏覽器使用網(wǎng)絡(luò)數(shù)據(jù)庫或網(wǎng)絡(luò)服務(wù)。使用從網(wǎng)絡(luò)取回的數(shù)據(jù)做的媒體瀏覽器,參看例子Android TV
為了給媒體瀏覽應用增加視覺趣味,我們可以在用戶瀏覽的內(nèi)容時更新背景圖片。這種技術(shù)可以讓我們的應用程序的互動感倍增。
Leanback庫提供了BackgroundManager類為我們的TV應用的activity更換背景。下面的例子演示了如何創(chuàng)建一個簡單的方法更換背景:
protected void updateBackground(Drawable drawable) {
BackgroundManager.getInstance(this).setDrawable(drawable);
}
許多現(xiàn)有的媒體瀏覽應用在用戶瀏覽媒體列表自動更新的背景。為了做到這一點,我們可以設(shè)置一個選擇監(jiān)聽器,根據(jù)用戶的當前選擇自動更新背景。下面的例子演示了如何建立一個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();
}
}
};
}
注意:以上的示例是為了簡單。當我們在自己的應用程序創(chuàng)建這個功能,我們應該考慮運行在一個單獨的線程在后臺更新操作獲得更好的性能。此外,如果我們正計劃在用戶觸發(fā)項目滾動時更新背景,考慮增加一個時延,直到用戶停止操作時再更新背景圖像。這樣可以避免過多的背景圖片的更新。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: