`
phenom
  • 浏览: 409333 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

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

 
阅读更多
机顶盒应用不同于手机应用,因为多数是没有触摸屏的,只能靠遥控器,所以要保持一个焦点的位置,让用户知道当前操作作用的对象.
然而一些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,必须是:分数接近,考同一所学校,同一专业,而且还得都接近分数线,你上了他就不能上的这种.
-------------------------------------------------





分享到:
评论
6 楼 happytianqiu 2015-08-20  
你好,我最近也在搞这个,能发个demo吗,邮箱是:624951030@qq.com
5 楼 clwwlc 2015-04-10  
有demo吗
4 楼 1305667675 2015-03-06  
帮了我大忙啊。。。。要在if(event.getAction()==KeyEvent.ACTION_DOWN){条件下才行哦
3 楼 逆生长 2015-02-03  
有完整的例子吗
2 楼 ivan18248 2014-03-08  
正在研究中。。。。
1 楼 自由之风007 2013-11-18  
从头认真的看了一遍 收货不小 得到了一些有益的启发 感谢楼主

相关推荐

    android机顶盒listview

    "android机顶盒listview"这个主题主要关注如何在Android TV应用中有效地使用ListView控件,来实现遥控器操控和视觉动画效果。ListView是Android系统中一个用于展示大量数据的视图组件,它允许用户滚动浏览条目,非常...

    安卓机顶盒相关-机顶盒应用的demo.rar

    【标题解析】:“安卓机顶盒相关-机顶盒应用的demo.rar”表明这...通过以上分析,我们可以了解到这个压缩包主要包含安卓机顶盒应用的开发示例,适合初学者或有经验的开发者参考学习,提升在机顶盒应用开发领域的技能。

    机顶盒ImageView获取焦点

    在Android移动端开发中,尤其是针对机顶盒应用的开发,用户界面交互是非常关键的一部分。`ImageView`作为Android SDK中的一个核心组件,主要用于显示图像资源,如图片、图标等。然而,默认情况下,`ImageView`并不...

    安卓机顶盒相关-TV端GridView焦点移动事件处理.rar

    在这个“安卓机顶盒相关-TV端GridView焦点移动事件处理”的主题中,我们将探讨如何在TV应用中处理GridView的焦点移动事件。 首先,我们需要了解TV应用的基本交互原则。在电视上,用户通过遥控器的上下左右按键来...

    EPG在Android机顶盒的实现和优化.pdf

    电子节目指南(EPG)是数字电视系统中用于提供节目信息的图形用户界面,它使用户能够浏览当前和未来的电视节目...这些知识点和技术的综合运用,对于开发者设计和优化Android机顶盒中的EPG应用提供了重要的参考和指导。

    机顶盒开发资料 超全奥

    机顶盒开发是一个复杂而全面的过程,涉及到硬件接口、操作系统、用户界面以及各种服务和应用的集成。在本文中,我们将深入探讨标题和描述中提到的几个关键知识点,包括机顶盒开发、ViewPager以及源码分析。 首先,...

    Android开发之机顶盒上gridview和ScrollView的使用详解

    在Android开发中,特别是在机顶盒应用开发场景中,`GridView` 和 `ScrollView` 是两种常用的布局组件。本文将深入探讨如何在机顶盒环境中有效使用这两种组件,并解决焦点问题和滚动冲突。 `GridView` 是一个显示多...

    以机顶盒为中心的家庭智能监控系统.pdf

    这使得机顶盒的操作系统逐渐统一到Linux系统和Android系统,成为多任务处理平台。过去,机顶盒主要用来收看电视,但随着双向网络进入家庭,以及机顶盒具备Wi-Fi上网功能,如何利用这些特性为用户提供更多增值服务...

    google电视开发实例(全)

    这些实例是针对机顶盒和智能电视设计的,旨在帮助开发者构建高效、用户友好的电视应用。 首先,我们要理解Android TV是Android操作系统的一个分支,专为大屏幕设备如智能电视和机顶盒设计。它提供了丰富的API和工具...

    Android videoview抢占焦点的处理方法

    android 机顶盒应用: 应用程序主界面(MainActivity)只有两个控件,一个videoview和一个button。 视频框设置无焦点,按键有焦点。 首次进入应用时焦点正常,聚焦在button上;但是当点击button跳转到下一个activity...

    android高仿网易新闻客户端,title可以动态添加或减少

    在STB(Set-Top Box,机顶盒)上运行此应用,需要考虑遥控器操作的适配。Android TV或STB应用通常需要遵循Leanback库提供的设计指南,以确保遥控器操作的便利性。可以使用 Leanback Support Library 中的...

    benren de kenengsheji

    特别值得注意的是,在Android 2.2平台上开发的地图显示应用,展示了Java编程语言在移动设备上的巨大潜力。用户可以通过这些应用进行地图的浏览、缩放、定位等操作,极大地方便了日常出行和信息获取的需求。这一技术...

    深度剖析:为何十核智能电视还是这么卡?

    许多应用开发商为了追求利润,在APP中植入大量广告,不仅拖慢了智能电视的运行速度,还可能导致系统不稳定。此外,一些大型App在安装时可能会自动附带安装其他应用,这些不良行为增加了智能电视的运行负担,导致系统...

Global site tag (gtag.js) - Google Analytics