转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52835829
前言:上篇中,《Android TV开发总结(二)构建一个TV Metro界面(仿泰捷视频TV版)》对应的源码解析见《TV Metro界面(仿泰捷视频TV版)源码解析》一文,链接:http://blog.csdn.net/hejjunlin/article/details/52822499,github对应地址:https://github.com/hejunlin2013/TVSample,截至到当前发稿,已突破200star,如果喜欢的话,可以star,也表示下支持,今天主要总结下TV开发中有焦点问题。
在TV开发中没有以前我们phone端的dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 事件来分发,而需要使用dispatchKeyEvent、onKeyDown、onKeyLisenter 等事件来分发处理焦点事件传递,而且TV端焦点没有什么好办法可以全局控制,需要我们自己来想办法规定焦点走向,可以参考我的View焦点总结《Android View框架总结(二)View焦点》,本篇做应用场景补充说明及遇到有坑,看下Agenda:
- 采用Android自带的直接控制焦点上下左右
- 采用setOnFocusChangeListener控制焦点
- adb按键派发控制焦点
- 遇到的坑-遥控器按键失灵案列
Android TV 开发与一般Android开发最大的区别在于焦点控制 , 用户在使用Android TV设备主要是通过遥控器操作app。焦点就是让用户知道的直接交互行为。 然而一些app,依据系统对focus的判断,会出现的状况: 上下导航时,不是想要的结果. 边缘移动时,会出现焦点丢失的状况. 有时想直接定位到某个位置上.
android提供了一些焦点相关的属性,在现有的框架层下通过设置View的属性来获得焦点
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/f87babeb831d4f81a730b4262fd40505.png)
下面列出三种方法处理焦点问题
一、采用Android自带的直接控制焦点上下左右的方法
采用Android自带的直接控制焦点上下左右的方法
因此在进行布局时有必须要通过view.setId(…)指定view的特定ID,然后通过view.setNextLeftView(…)等四个方法控制该view的上下左右移动后所到达的view。然而这种方法只适用于前提就设置好ID的场景,不适合动态布局的场景。
看如下一段布局:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/96490355f029f627d62d6a8d7d0cf93d.png)
rg_a1,rg_a2,rg_a3,rg_a4实际业务中会写明其含义,而不是a1,a2之类,这里只是为介绍,这个自定义的MyCustomButton,按遥控器左键时,将找id为rg_a1的view,焦点跳过去,按遥控器右键时,将找id为rg_a2的view,焦点跳过去,按遥控器下键时,将找id为rg_a3的view,焦点跳过去,按遥控器上键时,将找id为rg_a5的view,焦点跳过去。
二、采用setOnFocusChangeListener控制焦点
看如下一段代码:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/6ffa5f095ea960552b373c08d036cac2.png)
当OnFocusChangeListener时,就是从一个焦点跳到另一个view上的变化过程。
三、adb按键派发控制焦点
按键的派发须了解一此KeyCode,下面是平时用到的主要的一些方向键:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/dc26099e1a22d246080220efa0593d4c.png)
在按键过程中 按下和松开