您的位置:首页 > 移动开发 > Android开发

TV端开发小结

2016-06-07 11:54 639 查看
两个多月的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:



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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息