TV端开发小结

两个多月的tv项目终于提交终审了,趁热打铁总结下这段期间的一些收获和遇到的坑
一、资源的适配
又可以分为图片的适配(drawable目录)和尺寸的适配(dimens文件)
1. tv端主流的屏幕分辨率有两种,1280*720 和 1920*1080
按照Google推荐的分辨率放置图片资源
Android TV(1080p)对应xhdpi
Android TV(720p)对应hdpi
也就是说,720p的切图放在drawable-hdpi目录下,1080p的切图放在drawable-xhdpi的目录下
2. dimens的计算
虽然官方推荐用与屏幕密度无关的dp做度量单位,奈何大家一致用px,保险起见,dp的方案就给pass掉了,短暂研究过一下dp的适配,个人的经验是1920*1080上的1px等于0.5dp,也就是dp:px=1:2的关系(大概是这么个换算关系吧,匹配的机型有限,时间有限,所以有待验证)

最终的方案是使用px为单位,匹配了两套dimens(美工切图标准是1920x1080),values-1280x720和values-1920x1080
720p:
720p
1080p:
1080p
从px1到px1920,慕课网上有一节讲android屏幕适配的课程,可以参考makeXml来解决dimens工作量大的问题
二、焦点的控制
焦点的控制是tv端开发的特点也是难点,手机开发中熟悉的Gesture操作和touch事件全部失效,取而代之的是遥控控制逻辑和OnKeyDown处理
1. 布局简单的情况
xml中设置控件属性android:focusable=”true”(如需处理点击事件,还需设置clickable=”true”),如果布局简单可以直接指定nextFocusLeft(Right/Up/Down/Forward)的控件Id
2. 稍复杂的布局(如左边listView右边GridView或者好几个RecyclerView)
设计图
如上图,设计要求:
①ListView重新获取焦点时,让其选中上次selected的item,而不是系统的就近原则
(比如现在焦点在“排行”分类下的“勇敢的心”,按左键焦点应回到“排行”上)
解决方案:重写listView
具体参考http://www.xuebuyuan.com/2059645.html
②上一行最后一个item右键到下一行第一个
解决方案:重写GridView

`
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
int numColumns = getNumColumns();
if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
int jumpPosition = getSelectedItemPosition() + 1;
if(jumpPosition < getCount() && jumpPosition % numColumns == 0){
setSelection(jumpPosition);
return true;
}
}
return super.onKeyDown(keyCode, event);
}

3. 相对比较奇葩的情况
ViewGroup的requestChildFocus(View child, View focused)结合View本身的requestFocus()可以解决大部分焦点丢失的情况,若还是不行,则需要给根布局设置OnGlobalFocusChangeListener

三、事件处理
重写dispatchKeyEvent(KeyEvent event)或者onKeyDown(int keyCode, KeyEvent event)
具体处理就是一堆if else or switch case了
1. 左键—KeyEvent.KEYCODE_DPAD_LEFT
2. 右键—KeyEvent.KEYCODE_DPAD_RIGHT
3. 上键—KeyEvent.KEYCODE_DPAD_UP
4. 下键—KeyEvent.KEYCODE_DPAD_DOWN
5. 返回键—KeyEvent.KEYCODE_BACK
6. 确认键—KeyEvent.KEYCODE_ENTER || KeyEvent.KEYCODE_DPAD_CENTER
7. 菜单键—KeyEvent.KEYCODE_MENU
8. 音量+键—KeyEvent.KEYCODE_VOLUME_UP
9. 音量-键—KeyEvent.KEYCODE_VOLUME_DOWN
10. 静音键—KeyEvent.KEYCODE_MUTE
11. Home键—KeyEvent.KEYCODE_HOME
需要注意的是,home键为系统键,在dispatchKeyEvent或onKeyDown方法里处理无效,故home键的处理需要另寻他法,可参考http://www.cnblogs.com/mengdd/p/3951223.html进行监听。

最后推荐几个TV端的开源框架:
https://git.oschina.net/hailongqiu/AndroidTVWidget
https://github.com/joychang/SMTVLauncher
http://kaifa.tv

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值