W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
編寫: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)用程序的媒體目錄瀏覽音樂或視頻。
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í)再更新背景圖像。這樣可以避免過多的背景圖片的更新。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: