前言

由于最近的项目需要运行在安卓智能电视上,除了正常的功能开发外,为了操作方便还需要对遥控器进行支持。这里记录对遥控器支持的主要思路。

原理支持

Android设备对遥控器的响应是通过分发KeyEvent的方式进行的,体现在界面上是focus焦点在view间的移动等。

因此,我们可以从两方面入手,一是拦截系统事件分发过程,二是借助系统提供的属性实现焦点移动。

具体实现

方案一

拦截系统事件分发过程对相应的KeyEvent分别进行处理。这种方案需要自己记录焦点位置管理焦点的移动等。可以通过重写dispatchKeyEvent、onKeyUp、onKeyDown等实现系统事件拦截,实践证明dispatchKeyEvent最合适,它处在事件分发过程靠前的位置可以保证所有的事件都能接收到,而onKeyUp、onKeyDown有些按键(比如确认键)是接收不到的。

示例代码

   @Overridepublic boolean dispatchKeyEvent(KeyEvent event) {int keyCode = event.getKeyCode();int action = event.getAction();return handleKeyEvent(action, keyCode)||super.dispatchKeyEvent(event);}private boolean handleKeyEvent(int action, int keyCode) {if (action != KeyEvent.ACTION_DOWN)return false;switch (keyCode) {case KeyEvent.KEYCODE_ENTER:case KeyEvent.KEYCODE_DPAD_CENTER:... //确定键enterbreak;case KeyEvent.KEYCODE_DPAD_DOWN:   ...//向下键break;case KeyEvent.KEYCODE_DPAD_UP:   ...//向上键break;case KeyEvent.KEYCODE_DPAD_LEFT: ...//向左键break;case KeyEvent.KEYCODE_DPAD_RIGHT:  ...//向右键break;default:break;}return false;}

焦点逻辑需要自己处理,突出焦点可以通过为view设置实现了多种state的selector-drawable作为背景来实现。这里要注意下,遥控器按下、松开会出发两次事件,这两个事件只处理一个就好,所以上面代码对action做了过滤

if (action != KeyEvent.ACTION_DOWN){return false;
}

如果我们已经对事件做了处理要返回true通知系统事件已经被消费掉了不需要继续处理,如果不是我们感兴趣的事件要返回false让系统继续处理。另外确定键(OK键或者方向键中间按键)的处理建议采用模拟点击的方式,比如调用view的performClick方法,这样能让系统自己走touch该view的分发过程,达到思路最简单,代码最少的目的。

该方案的好处是不管什么样的界面都可以通过代码控制,具有普适性。但是由于焦点控制需要自己维护逻辑可能相对复杂,如果界面不是通过代码生成而是相对固定的可以通过第二种方案来实现。

方案二

系统提供了一些焦点相关的属性,通过设置View的属性来实现焦点转移

android:focusable:设置一个控件能否获得焦点
android:background:设置作为背景的drawable实现焦点突出
android:nextFocusDown:定义下一个获得焦点的控件当按下键时
android:nextFocusUp:定义下一个获得焦点的控件当按上键时
android:nextFocusLeft:定义下一个获得焦点的控件当按左键时
android:nextFocusRight:定义下一个获得焦点的控件当按右键时

如果界面相对固定,都是在xml文件中事先定义好的,可以通过上面的属性来实现遥控器按键的响应。这种方案不能保证所有view都能响应,实践证明,xml中设置无效的可以通过requestFocus强制设置一个焦点到指定的view。

该方案不需要拦截事件分发过程,但要求界面固定,可以根据具体情况选择合适方案,个人推荐方案一。

让 Android 应用响应智能电视遥控器相关推荐

  1. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

  2. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

  3. Android@Home与智能家居

    何为智能家居? 智能家居是一个居住环境,又称智能住宅.通俗地说,它是融合了自动化控制系统.计算机网络系统.无限传感网络系统.和网络通讯技术于一体的网络化智能化的家居控制系统.智能家居将让用户有更方便的 ...

  4. Android实现APK智能安装且安装后自启动,亲测有用!

    一.智能安装 (一)什么是智能安装? 最近因为公司需求需要实现智能安装,apk从服务器上下载后,自动打开安装,安装完后自己打开,难了我好长时间才实现的,记录一下. 首先实现有两种方式: 静默安装: 在 ...

  5. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...

    Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...

  6. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

    Android系统的运行时库层代码是用C++来编写的,用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本文 ...

  7. android 智能家居 设计 实现,基于Android系统的智能家居APP设计与实现.doc

    PAGE 22 PAGE 21 基于Android的智能家居APP的设计与实现 华北电力大学硕士学位论文 摘 要 - PAGE VI - PAGE I 摘 要 随着科学技术的不断发展,人们生活水平也逐 ...

  8. 基于android的智能导航系统,基于Android系统的智能导航小车设计

    摘要: 智能移动机器人的主要作用是利用机器人的特性完成人类不易完成的工作,目前智能机器人除了用于探索未知区域,帮助人类执行危险任务以外,越来越多的民用机器人已经出现在我们的日常生活中.目标识别.路径规 ...

  9. tcl电视android无响应,应用不足:Android智能电视陷入困境

    自去年底,康佳.创维.TCL等深圳几大彩电厂家纷纷推出智能电视,试图借Android及其应用为电视产品革新,不过现在看来,Android并没有那么美好,丰富的应用并没有顺利移植到电视之上.日前,三星( ...

最新文章

  1. 申请鸿蒙选择应用程序是什么,申请鸿蒙系统有一个应用选择怎么选择呢
  2. leetcode#42 Trapping rain water的五种解法详解
  3. [K/3Cloud]DBServiceHelper.ExecuteDataSet(this.Context, sql)) 返回数据问题
  4. linux ntfs 速度慢,将U盘磁盘格式改成NTFS解决u盘复制速度慢问题
  5. RestartOnCrash一个监控进程的小工具,可用于监控iis/apache/mysql等程序
  6. python--之np.any,np.a;;
  7. 将SpringBoot项目打包并部署到云端 -- jar、war、tomcat
  8. 管理感悟:眼高手低到眼高手高
  9. springboot框架的网上书城系统 java图书销售系统
  10. 惠康游戏手柄 WE-8400 Windows 10 驱动教程
  11. 算法笔记--最短路径之dijkstra算法
  12. 清华陈丹琦:如何让「大模型」变小
  13. Java中获取当前时间、昨天、三天前、一周前、一月前时间(2)
  14. 大数据对于企业的价值,主要体现在哪几个方面?
  15. python下faker模块引入报错:Traceback (most recent call last) 解决办法
  16. Gym 101778G
  17. 【OWASP Top 10】2021版
  18. linux修改文件图标,Gnome怎么修改应用图标icon
  19. 虚函数、虚函数表、虚继承
  20. 联想a366t 刷android4,联想A366t线刷刷机教程(刷官方rom)

热门文章

  1. kafka:过期数据清理
  2. Only老K说-spa项目实现jwt验证码
  3. GMap.NET使用过程的一些笔记
  4. 大容量存储方案_数字视频监控大容量存储解决方案
  5. 让文档的奇偶页的页眉和页脚不同
  6. Docker全命令详解
  7. CH340驱动安装失败
  8. Linux下达梦数据库导入导出
  9. 传智黑马Java → 28同步技术的原理(同步代码块)
  10. 漏洞学习之:MS17-010