Android TV开发 焦点控制
转载:http://www.eoeandroid.com/thread-264177-1-1.html
最近在做一款基于Android的互联网电视客户端,开发与phone/pad差不多,但是有一个值得注意的地方就是焦点控制的问题。
在TV上做应用开发,由于TV呈现的界面比较大,上面放的View/layout也比较多,用户操作是主要是通过遥控器操作(通常是用遥控器,
如果支持映像触控技术,那么view也要实现类似phone/pad上的触屏操作),因此,在对iew的上下左右移动的控制就要处理好。
经过这一段时间的开发,总结出两套比较有用的控制焦点的机制。特在此分享。
第一种方法:采用Android自带的直接控制焦点上下左右的方法。这种方法的前提是必须知道每个view的id,因此在进行布局时有必须要通过view.setId(...)指定view的特定ID,然后通过view.setNextLeftView(...)等四个方法控制该view的上下左右移动后所到达的view。
第二种方法是:在一些比较复杂的Layout中,特别是涉及到在View的焦点变化的过程中还要控制view的背景以及字体颜色变化等。比如:在有多个Layout(假设有Layout1, Layout2, Layout3,每个Layout中都有若干个ImageButton),当你从Layout1中的某个ImageButton 1.1中移动Layout2中ImageButton 2.1,此时ImageButton 1.1要标识为被选中,但是失去焦点,此时ImageButton 2.1是选中并且获取焦点,再从ImageButton 2.1移到ImageButton 3.1的过程中也是这种情况。对于这样一种情况,你必须对每个ImageButton 设置焦点捕获实际(setOnFocusChangeListener),在该监听事件中处理,(注:下面代码即兴写的,大概就是这个意思 --^_^-- )
ImageButton.setOnFocusChangeListener(){
public void onFocus(boolean Focus){
if( Focus ){
// ImageButton 2.1 获焦时, ImageButton 2.1 改变获取焦点背景, ImageButton 1.1也改变失去焦点背景
} else{
// // ImageButton 2.1 获焦时, ImageButton 2.1 改变失去焦点背景 , ImageButton 3.1也改变获取焦点背景
}
}
}
还有就是当你当前焦点移动到ImageButton 3.1上时,你有时需要知道此时Layout1、Layout2上是哪个ImageButton 被选中,因此你还必须设置三个ImageButton 变量(标识选中哪个布局中的那个ImageButton 对象),和三个int变量(标识选中哪个布局中的第几个)。
通过这些标识,你就可以很方便的了解到那个聚焦和哪个失去焦点了。
对于进行上下左右的控制,此时就要在OnKeyDown事件中进行捕获处理了。由于事先已经知道是哪个Layout中的哪个ImageButton被选中了,而此时你进行上下左右操作是在你被选中的View上进行操作的,因此在OnKeyDown中你只需先判断是哪个View被选中,然后根据按键事件来移动View(通过之前设置的int标识进行移动)(注:由于是即兴写的,可能部分代码有错误,这里只是描述这个意思,--^_^--)
假设Layout1中被选中的ImageButton为mFirstImgBtn, 序号为mFirstIndx;
Layout2中被选中的ImageButton为mSenondImgBtn, 序号为mSenondIndx;
Layout3中被选中的ImageButton为mThirdImgBtn, 序号为mThirdIndx;
每个Layout里面的ImageButton均在一个数组中,假设分别为:ImageButton mImgBtnArray1[], mImgBtnArray2[], mImgBtnArray3[],
当前被选中的view为 mSenondImgBtn
public void OnKeyDown(int keyCode, KeyEvent event){
if( event.KEYCODE_DROP_UP== keyCode ){ //如果按下的是上键
mImgBtnArray1[ThirdIndx ].requestFocus;
}
if( event.KEYCODE_DROP_DOWN == keyCode ){ //如果按下的是下键
mImgBtnArray3[ ThirdIndx ].requestFocus;
}
if( event.KEYCODE_DROP_LEFT == keyCode ){ //如果按下的是左键
mImgBtnArray1[ ThirdIndx-1 ].requestFocus;
}
if( event.KEYCODE_DROP_RIGHT == keyCode ){ //如果按下的是右键
mImgBtnArray1[ ThirdIndx+1 ].requestFocus;
}
}
而具体的获焦事件处理则在每个View的 OnFocusChangeListener 事件中处理。
Android TV开发 焦点控制的更多相关文章
- Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52835829 前言:上篇中,&l ...
- Android TV开发总结(六)构建一个TV app的直播节目实例
请尊重分享成果,转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52966319 近年来,Android TV的迅速发展,传统的有线电视受 ...
- Android TV开发总结(五)TV上屏幕适配总结
前言:前面几篇总结一些TV上的小Sample,开源到GitHub:https://github.com/hejunlin2013/TVSample, 点击链接,可以持续关注.今天总结下TV上屏幕适配. ...
- 聊聊真实的 Android TV 开发技术栈
智能电视越来越普及了,华为说四月发布智能电视跳票了,一加也说今后要布局智能电视,在智能电视方向,小米已经算是先驱了.但是还有不少开发把智能电视简单的理解成手机屏幕的放大,其实这两者并不一样. 一.序 ...
- Android TV开发总结(七)构建一个TV app中的剧集列表控件
原文:Android TV开发总结(七)构建一个TV app中的剧集列表控件 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必转载 ...
- Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听
原文:Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听 简单记录下android 盒子开发遥控器的监听 ,希望能帮到新入门的朋友们 不多说,直接贴代码 public cla ...
- Android TV开发总结(四)通过RecycleView构建一个TV app列表页(仿腾讯视频TV版)
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52854131 前言:昨晚看锤子手 ...
- Android TV开发总结(二)构建一个TV Metro界面(仿泰捷视频TV版)
前言:上篇是介绍构建TV app前要知道的一些事儿,开发Android TV和手机本质上没有太大的区别,屏大,焦点处理,按键处理,是有别于有手机和Pad的实质区别.今天来介绍TV中Metro UI风格 ...
- Android TV 开发 (1)
本文来自网易云社区 作者:孙有军 前言 这里主要记录几个TV问题的解决方案,如果对这个不感兴趣的其实就不用往下看了. 这几天有一个需求就是要求出一个TV版本的app,之前没有具体的了解Tv版的app有 ...
随机推荐
- echarts.js制作中国地图
一.准备 1. 打开sublime,新建一个echarts文件夹,新建echarts.html文件 2. 在echarts.html文件中,为ECharts准备一个Dom(id是china-map ...
- 22.struts2-拦截器.md
目录 1.执行的流程时序图 1.执行的流程时序图 回顾: Struts配置: * 通配符.动态方法调用 * 全局跳转配置.配置的默认值.常量配置 * Struts核心业务 * 请求数据的自动封装 (p ...
- Structs复习 简单数据校验
jar包 web.XML <?xml version="1.0" encoding="UTF-8"?> <web-app version=&q ...
- C#中属性和字段的区别
属性和字段的区别 在C#中,我们可以非常自由的.毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值.或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态 ...
- 使用pickle进行存储变量
有时候我们需要把我们的变量内容存下来,这时我们就可以用pickle来操作. 存储操作如下所示: #!/usr/bin/python # -*- coding:utf-8 -*- import pick ...
- centos6 7 yum安装mongodb 3.6
配置MongoDB的yum源 # 编辑文件 vim /etc/yum.repos.d/mongodb-org-3.6.repo # 添加以下内容 [mongodb-org-3.6] name=Mong ...
- python list [:1]
python 切片slice 1.补充: A = np.ones([, , ]) B = np.ones([, ]) C = A*B[:, None, :] C.shape = 2,1,4 https ...
- Python 基础常用
.连接符: + .基本类型: [] {} () list set :无序,不重复的集合 数据初始化: a = set('a','b'); 或者 {'1'} #只能初始化空的集合: 相关函数: 添加数据 ...
- IDEA配置 gradle
下载解压自己需要的gradle版本:https://gradle.org/releases/(免安装) 配置环境变量 打开命令窗口,输入 gradle -v IDEA配置gradle:file-&g ...
- SQLServer 学习笔记 序
邀月的博客 http://www.cnblogs.com/downmoon/archive/2011/03/10/1980172.html