之前一直从事手机APP应用开发,由于工作的需要转入TV电视端的开发,初次接触确实有点懵逼,在TV开发过程中的处理思路跟手机还是有很大区别的,接下来将讲述下TV开发过程的经验,与大家一起分享共同学习。
刚接触TV开发,需要我们转变下思路,在TV开发中没有以前我们手机端的什么 dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 事件来分发,而需要使用dispatchKeyEvent、onKeyDown、onKeyLisenter 等事件来分发处理焦点问题,而且TV端焦点没有什么好办法可以全局控制,需要我们自己来想办法规定焦点走向,可能一个没处理好,就一脸懵逼了,焦点为啥跑的不见了,焦点为啥跑那里去了等等问题。 接下来我们就说说在TV端开发的基础知识
Android TV app开发与一般Android开发最大的区别在于焦点控制 , 用户在使用Android TV设备主要是通过遥控器操作app。机顶盒应用不同于手机应用,因为多数是没有触摸屏的,只能靠遥控器,所以要保持一个焦点的位置,让用户知道当前操作作用的对象. 然而一些app,依据系统对focus的判断,会出现的状况: 上下导航时,不是想要的结果. 边缘移动时,会出现焦点丢失的状况. 有时想直接定位到某个位置上.
android提供了一些焦点相关的属性,在现有的框架层下通过设置View的属性来获得焦点
android:focusable:设置一个控件能否获得焦点
android:background:设置在作为背景的drawable
android:nextFocusDown:定义下一个获得焦点的控件当按下键时
android:nextFocusUp:定义下一个获得焦点的控件当按上键时
android:nextFocusLeft:定义下一个获得焦点的控件当按左键时
android:nextFocusRight:定义下一个获得焦点的控件当按右键时
<requestFocus/>:强制设置一个焦点到指定的view或它的一个子类,前提是android:focusable为true能够获得焦点
下面列出两种方法处理焦点问题
第一种方法:
采用Android自带的直接控制焦点上下左右的方法。这种方法的前提是必须知道每个view的id,因此在进行布局时有必须要通过view.setId(…)指定view的特定ID,然后通过view.setNextLeftView(…)等四个方法控制该view的上下左右移动后所到达的view。然而这种方法只适用于前提就设置好ID的场景,不适合动态布局的场景
第二种方法:
在一些比较复杂的Layout中,特别是涉及到在View的焦点变化的过程中还要控制view的背景以及字体颜色变化等。必须对每个ImageButton 设置焦点捕获实际(setOnFocusChangeListener),在该监听事件中处理
然后使用Key事件分发来确定焦点移动方向,一般可以使用onKeyDown事件进行处理接下来讲讲TV开发中需要了解的KeyCode 可以参考下Android常用的物理按键及其触发事件此博客讲解的按钮事件
常用的按键Code有
KEYCODE_MENU 菜单键
- * 方向键
- * KEYCODE_DPAD_CENTER
- * KEYCODE_DPAD_UP
- * KEYCODE_DPAD_DOWN
- * KEYCODE_DPAD_LEFT
- * KEYCODE_DPAD_RIGHT
在按键过程中 按下和松开的Action主要是ACTION_DOWN、ACTION_UP 事件分发和处理是在 ACTION_DOWN 中处理
此处需要特别说明的是 View.setFocusable(true); 改变控件是否可以获得焦点,然而同时会触发 setOnFocusChangeListener事件
接下来将会讲解在TV开发中所涉及到的控件使用技巧