安卓TV开发(五) 移动智能终端UI之实现主流TV视频播放器UI



UI ;

一,实现遥控器Ok键Item点击事件

AdapterView<T extends Adapter>OnItemClickListener接口

源码如下:

/*** Interface definition for a callback to be invoked when an item in this* AdapterView has been clicked.*/public interface OnItemClickListener {/*** Callback method to be invoked when an item in this AdapterView has* been clicked.* <p>* Implementers can call getItemAtPosition(position) if they need* to access the data associated with the selected item.** @param parent The AdapterView where the click happened.* @param view The view within the AdapterView that was clicked (this*will be a view provided by the adapter)* @param position The position of the view in the adapter.* @param id The row id of the item that was clicked.*/void onItemClick(AdapterView<?> parent, View view, int position, long id);}

以上代码不难理解 AdapterView 提供个一个回调,在我们所用到的actity中或view去实现此接口。本次可以复用以上接口,使开发者习惯安卓系统的条目监听。但由于我们的view并未继承AdapterView,而在回调必须要传入一AdapterView的父类,因此我们自定义自己的监听器。下面我们也给FocsView定义一个条目点击事件监听器。

/** * FocusView * Interface definition for a callback to be invoked when an item in this* FocusView item has been clicked. * @author liuyongkui. * @param <T> */public interface OnItemClickListener<T> {/*** @param mFocusView* FoucusView.* @param view* focus View item.* @param col* col Num.* @param row* row Num.* @param id* item id.*/void onItemClick(FocusView mFocusView, View focusView,FocusItemModle<TvModle> focusItem, int Postion, int row, int col, int id);}

同理为了开发者自定义效果,我们也为focusVIew的子条目心新增一个选中事件监听器。

/** * FocusView * Interface definition for a callback to be invoked when an item in this* FocusView item has been Selected. * @author liuyongkui. * @param <T> */public interface OnItemSelectedListener <T> {/*** @param <T> * @param mFocusView* FoucusView.* @param view* focus View item.* @param col* col Num.* @param row* row Num.* @param id* item id.*/public void onItemSelected(FocusView metroView, View view, T modle, int col, int row, long id);}

2 上列代码发现我用了一个接口泛型,此处原因是为了提高接口的扩展性,比如 开发中你定义的MusicModle ,以上的监听就会有问题了 会拋类型转换异常,因此当我们再给接口传什么Modle,回调的时候就会返回相应的modle.

等完成了接口圆原型,再定义他为FocusView内部属性

/** items mOnItemSelectedListener*/private OnItemSelectedListener mOnItemSelectedListener;/** items mOnItemClickListener */private OnItemClickListener mOnItemClickListener;@SuppressWarnings("rawtypes")public OnItemSelectedListener<?> getmOnItemSelectedListener() {return mOnItemSelectedListener;}public void setOnItemSelectedListener(OnItemSelectedListener mOnItemSelectedListener) {this.mOnItemSelectedListener = mOnItemSelectedListener;}

3 完成以上工作,考虑在何时调用此接口,通过要实现的目标就能知道答案,肯定是在用户点击Ok键时触发此回调,接着重写onKeyUp()事件

继续完善上篇中已实现的上下左右的键盘事件,

case KeyEvent.KEYCODE_DPAD_CENTER:if(mOnItemClickListener != null) {mOnItemClickListener.onItemClick(this,focusItem.getFocusView(), focusItem, focusItem.getPostion(), focusItem.getRow(), focusItem.getCol(), focusItem.getId());}break;}

当然到这里代码肯定会有报错,因此我的FocusITemModle 也要随之加入Position,ID等 由于本次代码无adapter,因此我个人是在focusView布局时setPosition,Id也是通通过行数和列数决定,

4 在activty中去实现此接口 ,和一般的listVIew,GrideVIew一样,但是导包必须到导入focusView的OnItemClickListener事件,值得注意的是 实现点此接口时需要我们传入object,在这里我传入: FocusItemModle<TvModle> ,和上篇有很大区别的是这次的FocusItemModle也适用了泛型,目的是为了代码灵活性。

FocusUIActivity extends Activity implements OnItemClickListener<FocusItemModle<TvModle>>

FocusView view = (FocusView) findViewById(R.id.focus_ui);view.setOnItemClickListener(this); 实现接口中的onItemClick()方法:

@Overridepublic void onItemClick(FocusView mFocusView, View focusView,FocusItemModle<TvModle> focusItem, int Postion, int row, int col,long id) {Toast.makeText(getApplicationContext(), "row:" + row + "col:" + col, 1).show();}

通过以上三步我们完善了在按键Ok时触发的事件,同理选择事件并不需要我们按键触发,而是当Item获得焦点时触发,学习了前面知识的朋友。一定会觉得再简单不过了,这里留给读者去完善。

二,实现遥控器Ok键Item点击事件

“人无完人金无足赤”,只要是人就不会是完美的,

安卓TV开发(五) 移动智能终端UI之实现主流TV视频播放器UI

相关文章:

你感兴趣的文章:

标签云: