机顶盒应用不同于手机应用,因为多数是没有触摸屏的,只能靠遥控器,所以要保持一个焦点的位置,让用户知道当前操作作用的对象.
然而一些app,依据系统对focus的判断,会出现的状况:
上下导航时,不是想要的结果.
边缘移动时,会出现焦点丢失的状况.
有时想直接定位到某个位置上.
所有这些,都是针对机顶盒应用特有的,之前没有接触过,也搜索一些网上文章,坑人的居多,有用的没有.
现在说下本人的 实践情况:
setnextfocusid,还有类似的方法,是不可行的.因为它无法控制,而且是依赖系统定位.而且有时从一个控件到另一个控件,有时又到其它控件上,它无法做到.
于是就探索了keyevent.总结后,得出结论.需要覆盖Activity的public boolean dispatchKeyEvent(KeyEvent event) 方法.
然后可以依据些方法进行相应处理,可以解决绝大多数问题,(极少部分,我也无语.)
一个按键有两个触发点,一是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高级应用源码-机顶盒应用的demo.zip
手机的配置和机顶盒的配置还是有区别的,机顶盒的配置无论是cpu ,内存,存储设备(flash)的配置...所以基于对性能配置很高的应用或者游戏就可以应用于电视,本文收集了一些在android平台开发机顶盒方面的概念和知识。
相信现在很多人已经开始接触android机顶盒开发了,但是困扰大家的基本就是没有基础过遥控器操作与动画效果,此乃本人参照网上一些技术编写的基于机顶盒应用的demo
android 机顶盒UI demo 机顶盒 UI 桌面 插件 适合开发者使用。包含各种UI 设计,使用简单方便。 任何问题联@ 络
android手机遥控android机顶盒,实现鼠标、上下左右、震动软件 可以打游戏,可以完全取代机顶盒外置鼠标和遥控器
在Android应用程序中,有一类...这个PPT讲Android应用程序输入事件的分发和处理过程,主要涉及到输入管理InputManager、输入事件监控线程InputReader、输入事件分发线程InputDispatcher,以及应用程序主线程消息循环。
android机顶盒开发遇到的问题,长时间研究得出的结论
基于安卓机顶盒上的launcher开发,这是所有应用的一部分,里面有卸载等等其他功能。
可以安装在android 机顶盒上看视频。平板也可以 这个主要是支持遥控操作
Android机顶盒视频开发,完美解决GSYVideoPlayer视频播放的快进快退问题
文档主要介绍了,android机顶盒开发中的技术点
第2篇为应用开发篇,通过实例介绍了Android UI布局、Android人机界面、手机硬件设备的使用、Android本地存储系统、Android中的数据库、多线程设计、Android传感器、Android游戏开发基础、Android与Internet,以及...
ImageView获取焦点的问题,适用于Android移动端的开发 特别是机顶盒项目开发
《创意之钥:Android手机交互应用开发》以android手机交互开发为平台,定位于创意从产生到实际应用的过程,将书中内容分为创意的真空、创意的奇点和创意大爆炸三篇。作者分别从灵感的获取、如何在android开发中发挥...
基于Android机顶盒的家庭网关设计.pdf
基于Android机顶盒手机遥控器的研究与设计.pdf
Android机顶盒主题切换的设计与实现.pdf
面向Android机顶盒的家庭网关系统设计.pdf
基于Android机顶盒的节目管理方案设计.pdf
EPG在Android机顶盒的实现和优化.pdf