开发android机顶盒应用 事件,焦点处理

2024-03-30 06:48

本文主要是介绍开发android机顶盒应用 事件,焦点处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载:http://phenom.iteye.com/blog/1905520

开发android机顶盒应用 事件,焦点处理

机顶盒应用不同于手机应用,因为多数是没有触摸屏的,只能靠遥控器,所以要保持一个焦点的位置,让用户知道当前操作作用的对象.
然而一些app,依据系统对focus的判断,会出现的状况:
上下导航时,不是想要的结果.
边缘移动时,会出现焦点丢失的状况.
有时想直接定位到某个位置上.

所有这些,都是针对机顶盒应用特有的,之前没有接触过,也搜索一些网上文章,坑人的居多,有用的没有.

现在说下本人的 实践情况:
setnextfocusid,还有类似的方法,是不可行的.因为它无法控制,而且是依赖系统定位.而且有时从一个控件到另一个控件,有时又到其它控件上,它无法做到.

于是就探索了keyevent.总结后,得出结论.需要覆盖Activity的public boolean dispatchKeyEvent(KeyEvent event) 方法.
然后可以依据些方法进行相应处理,可以解决绝大多数问题,(极少部分,我也无语.)

Java代码 收藏代码

 一个按键有两个触发点,一是up,一是down,如果需要指定焦点,使用view.requestFocus(),而且需要在down上执行,因为up时,系统已经定位新的焦点了.再执行就未必是想要的结果.  int keyCode=event.getKeyCode();  if (event.getAction()==KeyEvent.ACTION_UP) {  up事件,这里多数情况不需要处理.  } else {down事件  或许可以直接覆盖onKeyDown方法,而不是这个.  if(keyCode==KeyEvent.KEYCODE_DPAD_UP){  } else if (keyCode==KeyEvent.KEYCODE_DPAD_LEFT) {  } else if (keyCode==KeyEvent.KEYCODE_DPAD_RIGHT) {  } else if (keyCode==KeyEvent.KEYCODE_DPAD_DOWN) {  } else if (keyCode==KeyEvent.KEYCODE_DPAD_CENTER||keyCode==KeyEvent.KEYCODE_ENTER) {  }  这是主要处理的遥控器的几个方向,最后一个,有些机顶盒太恶劣了,你自己看着办吧.  方向不是研究重点.  这个程序涉及的内容较多,ui使用Fragment构造,所以还更恶心一些.  比如在一个Fragment中的焦点,先得到Fragment,Fragment top=getFragmentManager().findFragmentById(R.id.content);  然后如果需要直接定位到某一个焦点,需要调用top中的一些方法,比如可以类型转换为xxFragment,然后调用.但是针对每一个Fragment都这样处理上一个,下一个焦点,累死人了.而且系统会变慢.  多数情况需要依赖系统的定位,然后针对一些特殊的情况,系统定位失败的再进行定向处理.  出现问题的多数是GridView,这样的ViewGroup控件,比如现在有两行,焦点在第一行,然后向下按键KeyEvent.KEYCODE_DPAD_DOWN.在event.getAction()==KeyEvent.ACTION_DOWN中判断,会出现不想要的结果,比如它不会定位下一个焦点还是GridView,也不是它的下一行,因为它把整个GridView当成一个控件,下一个:final View downView=currentFocus.focusSearch(View.FOCUS_DOWN);搜索得到的downView有可能是空的,有可能是另一个控件,比如Button,然而在焦点出现异常时,不能在这里return true;这样是无法到它第二行的.在ACTION_UP中,如果之前的down不返回true,会得到下一行焦点.  这里提供另一种方法:还是在down中处理:  if (currentFocus instanceof GridView) {  GridView gridView=(GridView) currentFocus.getParent();  int column=gridView.getNumColumns();  int selPos=gridView.getSelectedItemPosition();  int count=gridView.getAdapter().getCount();  Log.d(TAG, "selPos:"+selPos+" count:"+count+" column:"+column);  if (selPos>=column*2) {   //如果是GridView的最下边,再向下,需要翻页.  if (fragment.pageDown()) {  Log.d(TAG, "向下翻页了.");  }  return true;  } else {  if (count<=column||(count>column&&count<=column*2&&selPos>=column)) {  if (fragment.pageDown()) {  Log.d(TAG, "品牌向下翻页了,已经是最后一页.");  }  return true;  }  }  }  这样可以判断当GridView的焦点在第一行时,如果选中项的位置也是第一行,可以依据系统定位,它会移动到第二行,依次类推.如果是最后一行,其实也可以依据系统定位,如果没有特殊要求.  }  还有些针对GridView,比如移动边缘,左边缘,再向左,焦点保持不变的位置,就可以依据这个选中的位置与它的列数判断了,然后return true;消耗这次事件,就可以了.  其它单个控件,几乎都可以直接判断View right=currentFocus.focusSearch(View.FOCUS_RIGHT); 这四个方向的情况 就可以了.因为不存在控件内部的定位.  

如果各位大侠有更好的办法,请留言.

-------------------------------------------------  

- 你我都是程序猿,适当共享信息,提高能力,是一个it人应尽的责任. 两个程序猿,即使在一个公司,能成为竞争对手(正规的竞争)的可能性接近于零.
- 就像高中同学,考大学,成为竞争对手的概率是一样的,接近0,必须是:分数接近,考同一所学校,同一专业,而且还得都接近分数线,你上了他就不能上的这种.

-------------------------------------------------  

这篇关于开发android机顶盒应用 事件,焦点处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/860768

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2