前言:关于《TV Metro界面(仿泰捷视频TV版)源码解析》由于都是相关代码,就不发公众号了,有兴趣的可以看链接:http://blog.csdn.net/hejjunlin/article/details/52822499,今天介绍下TV开发中有焦点问题。

在TV开发中没有以前我们phone端的dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent

事件来分发,而需要使用dispatchKeyEvent、onKeyDown、onKeyLisenter

等事件来分发处理焦点事件传递,而且TV端焦点没有什么好办法可以全局控制,需要我们自己来想办法规定焦点走向,可以参考我的View焦点总结[《Android

View框架总结(二)View焦点》](http://blog.csdn.net/hejjunlin/article/details/52263256),本篇做应用场景补充说明

Android TV 开发与一般Android开发最大的区别在于焦点控制

, 用户在使用Android TV设备主要是通过遥控器操作app。焦点就是让用户知道的直接交互行为。

然而一些app,依据系统对focus的判断,会出现的状况: 上下导航时,不是想要的结果. 边缘移动时,会出现焦点丢失的状况.

有时想直接定位到某个位置上.

android提供了一些焦点相关的属性,在现有的框架层下通过设置View的属性来获得焦点

下面列出三种方法处理焦点问题

1采用Android自带的直接控制焦点上下左右的方法

因此在进行布局时有必须要通过view.setId(…)指定view的特定ID,然后通过view.setNextLeftView(…)等四个方法控制该view的上下左右移动后所到达的view。然而这种方法只适用于前提就设置好ID的场景,不适合动态布局的场景。

看如下一段布局:

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,焦点跳过去。

2setOnFocusChangeListener

看如下一段代码:

当OnFocusChangeListener时,就是从一个焦点跳到另一个view上的变化过程。

3按键派发

按键的派发须了解一此KeyCode,下面是平时用到的主要的一些方向键:

在按键过程中 按下和松开的Action主要是ACTION_DOWN、ACTION_UP事件分发和处理是在ACTION_DOWN中处理

当设置View.setFocusable(true); 改变控件是否可以获得焦点,然而同时会触发 setOnFocusChangeListener事件

在adb中,可以通过注入的方式模拟按键进行焦点移动,如 adb shell input keyevent 3 给示模拟Home键

以下是的KEYCODE供参考:

遇到的坑-遥控器按键失灵

问题描述:播放中出现屏保,从屏保回到某页面后,遥控器失灵。从某页进入全屏播放,暂停,等小米的屏保出来后将屏保消失,返回到某页面继续播放。此时遥控器方向键、确定键均无响应。Home键、电源键有响应。菜单键有响应。

分析:没有响应,按键被拦截,查了下当时改动的代码时,对按键并未做特殊拦截…. 对比之前的版本,没有这个问题。确认问题出现在浮层…从log中看,onWindowFocusChanged,在从h5界面/屏保界面回到某页面,没有被调用。

说明从window到activity这层,按键就被吃掉了。

接着分析:整个BaseActivity,没有接收到Action_Down事件

Log中打印的“Dropping event due to no window focus”,思路又断了。

继续做对比,发现show出浮层时,没有任何异常,但是只要show时,焦点移动,就能复现按键不响应。最后就定位到一个自定义控件上

再接着分析:这个控件1600多行代码,最初一直在找之前版本改动的地方区别,之前版本主要是做一些对这个控件的定制化,其他的先不考虑,排除法,找和event相关的方法。dispatchKeyEvent没有任何异常,又没有思路了,既然是系统级别的传递过程中就被吃了,会不会和view相关,因为只要焦点移动,就失灵,焦点移动伴随着,有一个popupwindow弹出,最终定位在onAttachWindow,好像也没有做什么特殊的事,用了一个getHandler,起初我以为是个自己写的方法,追点进去getHandler一看,是View的

问题修复:

总结:用View的Handler以前是为处理popupwindow时,popupwindow通过post的方式去show,但是如果此时activity

ondestory则会导致出错,所以加了onDetachWindow和onAttachWindow,原因主要是在onDetachWindow时,mHandler.removeCallbacksAndMessages(null);这句话导致,它相当于是把window发给View这层message给移除了。最后修改只移除它对应的的runnable,问题修复。

android tv 菜单键,Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑相关推荐

  1. android tv 云播放器,Android TV开发总结(六)构建一个TV app的直播节目实例

    近年来,Android TV的迅速发展,传统的有线电视受到较大的冲击,在TV上用户同样也可以看到各个有线电视的直播频道,相对于手机,这种直播节目,体验效果更佳,尤其是一样赛事节目,大屏幕看得才够痛快, ...

  2. Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑

    原文:Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必 ...

  3. android tv 开发布局,Android TV开发总结(七)构建一个TV app中的剧集列表控件

    前言:剧集类控件,在TV app中非常常见,今天将介绍构建一个TV app中的剧集列表控件,此控件上传到我的Github:https://github.com/hejunlin2013/Episode ...

  4. android tv record,Android TV开发总结(一)构建一个TV app前要知道的事儿

    前言:近年来,智能电视的发展如火如荼,Googel 也在大力推进TV及穿带设备的发展,在互联网的风口,是猪也会飞,这句话并不是没有道理的.传统电视机厂商,基本都转型致力于智能电视的相关业务.处理电视硬 ...

  5. 基于Android的短信应用开发(三)——读取手机短信

    在上一次的学习中,我们读取了手机联系人并将其显示在短信界面上,而接下来,我们将开始读取手机短信了,下面先来看一下最终运行效果图吧. 首先看一下手机短信数据库,访问路径是:/data/data/com. ...

  6. Android TV开发总结(四)通过RecycleView构建一个TV app列表页(仿腾讯视频TV版)

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52854131 前言:昨晚看锤子手 ...

  7. Android Studio打包全攻略----Gradle-Build Variants构建定制版App

    上一篇文章 Android Studio打包全攻略-从入门到精通限于篇幅Build Variants的作用分析得还不够,这篇文章主要探讨如何构建特别定制版App. 你肯定看到过这样的App,类似于:打 ...

  8. Android二维码扫描开发(一):实现思路与原理

    2019独角兽企业重金招聘Python工程师标准>>> Android二维码扫描开发(一):实现思路与原理 Android二维码扫描开发(二):YUV图像格式详解 Android二维 ...

  9. 一个 TV app 的直播节目实例,包含各央视频道及卫视频道

    LivePlayback 项目地址:hejunlin2013/LivePlayback 简介:一个 TV app 的直播节目实例,包含各央视频道及卫视频道 PS:注册过魅族帐号的同鞋,帮忙投下魅族开发 ...

最新文章

  1. 单v100 GPU,4小时搜索到一个鲁棒的网络结构
  2. 基础理论:给定离散概率表求分布函数
  3. 【深度学习系列】迁移学习Transfer Learning
  4. 如何搭建一个“不可告人的”私人专属网盘?教程拿去
  5. vuex 最简单、最详细的入门文档
  6. 华为荣耀20s云服务_华为荣耀20和20s的区别
  7. 《人工智能如何走向新阶段》大家谈(跟帖,续)
  8. JavaScript:画廊案例
  9. 彻底删除文件(File Delete Absolutely) 最新3.01版本 也已经在中关村在线升级成功
  10. 爱创课堂每日一题第四天8/28日XML和JSON的区别?
  11. extern 关键字详解
  12. 机器学习——神经网络
  13. macbook配置java环境变量_mac上java环境变量配置
  14. android 获取本地视频文件以及缩略图
  15. 戴尔服务器r720矩阵卡无响应,戴尔r720阵列卡驱动
  16. 大学生英语跨文化交际阅读课程 Unit6 Text A
  17. C# 拼图游戏(超详细)
  18. 美团:不存在大众点评合并进美团App的可能性
  19. 教授专栏11|张处:企业支付政策和信用风险:来自信用违约掉期(CDS)市场的证据
  20. MLCC电容和电介质材料类别X5R,X7R,Y5V,COG等一些资料

热门文章

  1. LayUI可选择可输入下拉框
  2. 概率统计及其应用第三章知识总结_数学篇:概率论复习规划
  3. verilog中define、parameter、localparam的区别
  4. 大家说说房价还会不会涨?
  5. Meanshift聚类算法
  6. C#上位机开发(十二)—— SQLite的使用
  7. 电源模块trim引脚
  8. java面条对折问题
  9. PHP爬虫,提取网站中的关键词,用一次正则匹配,然后再PHP数组的操作
  10. 让小朋友学会LED点阵显示