开发android机顶盒应用 事件,焦点处理
2014-04-29 22:31
239 查看
群1 QQ:414801661已经加满,群2(未满)QQ:200241499
于是就探索了keyevent.总结后,得出结论.需要覆盖Activity的public boolean dispatchKeyEvent(KeyEvent event) 方法.
然后可以依据些方法进行相应处理,可以解决绝大多数问题,(极少部分,我也无语.)
于是就探索了keyevent.总结后,得出结论.需要覆盖Activity的public boolean dispatchKeyEvent(KeyEvent event) 方法.
然后可以依据些方法进行相应处理,可以解决绝大多数问题,(极少部分,我也无语.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 一个按键有两个触发点,一是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,必须是:分数接近,考同一所学校,同一专业, 而且还得都接近分数线,你上了他就不能上的这种. ------------------------------------------------- 原文地址http://my.eoe.cn/767795/archive/20311.html |
相关文章推荐
- 开发android机顶盒应用 事件,焦点处理
- 开发android机顶盒应用 事件,焦点处理
- AndroidTV/机顶盒 ListView获取焦点与点击事件问题处理方案
- Android应用开发—eventBus发布事件和事件处理的时序关系
- android应用开发详解(六)--------------事件处理机制
- 【Android应用开发技术:应用组件】事件处理机制
- 【Android应用开发技术:应用组件】Android事件处理机制
- android应用开发详解(六)--------------事件处理机制(续)
- Android应用开发学习笔记之事件处理
- Android应用开发学习笔记之事件处理
- 【Android游戏开发之九】(细节处理)触屏事件中的Bug解决方案以及禁止横屏和竖屏切换!
- PhoneGap android开发:本地事件处理API
- [Android开发]使用ViewPagerIndicator开源库处理其中事件分发机制
- android应用开发实战——edittext判断是否获取焦点
- Android开发实践 事件处理机制 全面分析
- Android官方开发文档Training系列课程中文版:手势处理之ViewGroup的事件管理
- Android中设计具有背景图的按钮—ImageButton的焦点及事件处理
- Android开发指南-用户界面-事件处理
- [置顶] Android开发知识(七):Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(上)
- Android应用开发—Android 消息处理机制:Handler&Message