在Android TV中開發, 需要處理焦點的移動, 爲了達到醒目的作用一般都會添加焦點移動動畫和焦點選中放大效果, 爲了方便在TV端使用RecyclerView, 故自定義TvRecyclerView來實現焦點選中與移動的效果.
效果如下:
一. TvRecyclerView使用
(1) 在佈局中添加 TvRecyclerView
<app.com.tvrecyclerview.TvRecyclerView
android:id="@+id/tv_recycler_view"
android:layout_width="match_parent"
android:layout_height="580dp"
app:focusDrawable="@drawable/default_focus"/>
(2) 設置TvRecyclerView的layoutManager和Adapter
mTvRecyclerView = (TvRecyclerView) findViewById(R.id.tv_recycler_view);
GridLayoutManager manager = new GridLayoutManager(NormalFocusActivity.this, 3);
manager.setOrientation(LinearLayoutManager.HORIZONTAL);
mTvRecyclerView.setLayoutManager(manager);
int itemSpace = getResources().
getDimensionPixelSize(R.dimen.recyclerView_item_space);
mTvRecyclerView.addItemDecoration(new SpaceItemDecoration(itemSpace));
NormalAdapter mAdapter = new NormalAdapter(NormalFocusActivity.this);
mTvRecyclerView.setAdapter(mAdapter);
mTvRecyclerView.setOnItemStateListener(new TvRecyclerView.OnItemStateListener() {
@Override
public void onItemViewClick(View view, int position) {
Toast.makeText(NormalFocusActivity.this,
ContantUtil.TEST_DATAS[position], Toast.LENGTH_SHORT).show();
}
@Override
public void onItemViewFocusChanged(boolean gainFocus, View view, int position) {
}
});
mTvRecyclerView.setSelectPadding(35, 34, 35, 38);
TvRecyclerView的使用與標準的RecyclerView相同.
二. TvRecyclerView屬性介紹
TvRecyclerView提供了以下幾個屬性:
<attr name="scrollMode"/>
<attr name="focusDrawable" format="reference" />
<attr name="isAutoProcessFocus" format="boolean" />
<attr name="focusScale" format="float" />
(1) scrollMode控制TvRecyclerView的滑動模式, TvRecyclerView的滑動模式有兩種:
① normalScroll: 默認情況下是這種模式, 當TvRecyclerView是這種模式時, 當焦點滑動到的view是沒有全部顯示出來的, TvRecyclerView將會向按鍵的方向滑動屏幕一半的距離.
②followScroll: 當TvRecyclerView是這種模式時, 當焦點滑動到view在屏幕當中就一直滑動, 效果與android Tv上的HorizontalGridView差不多. 對應圖2.
(2) focusDrawable 設置選擇的Drawable, 如圖一的白色選擇框, 默認是沒有設置, 想要這種效果需要設置此屬性或在代碼中設置.
(3) isAutoProcessFocus 控制焦點處理是由誰來做, 默認焦點由TvRecyclerView來處理.
當isAutoProcessFocus 爲false, 子view是可以獲得焦點的, 當isAutoProcessFocus爲true, 子view獲取
不到焦點, 焦點由TvRecyclerView來處理.
(4)focusScale 設置選中view時, view的放大係數. 大於1.0f才生效.
具體的使用方法可以參考源碼中的例子.
TvRecyclerView的使用與源碼從這裏TvRecyclerView獲取.