本文出处:http://blog.csdn.net/scarthr/article/details/42194659
TV UI就是指Android系统的数字电视的图形交互界面。TV UI最大的特点就是屏幕大,为此我们要解决好以下3个问题:
1. 为大屏幕提供适当的布局源文件
2. 保证UI在一定距离仍然可以看清
3. 为高清电视提供高分辨率图标和图像
一 TV UI布局
1. 把屏幕上导航控制菜单放在屏幕的左边或右边,并且将菜单内容以垂直的方式显示。
2. 创建分段UI时,通过使用Fragment和GridView来替代ListView,充分利用水平空间视图。
3. 使用RelativeLayout和LinearLayout进行布局。这两种布局使Android系统能够针对大小、对齐、纵横比以及屏幕的像素密度来匹配视图的位置。
4. 在视图控制之间提供足够的余地来避免一个杂乱的用户界面。
5. 把文本插入用户能够快速扫描到的小块中
6. 背景色和文字要有鲜明的颜色对比。
7. 使用与密度无关的像素单元(dp和sp)而不是绝对的像素单元。
8. 尽量在高分辨率下调整UI,这样当屏幕分辨率降低时,也可以适配。图片方面,尽量使用9.png的格式来作图。
二 TV UI导航设计
1. 确保所有布局都处于按键导航控制之下。
2. 为可视化的导航提供清晰的反馈
3. 通过合理的布局,使每一个UI更容易方位。
当你在为遥控器设计导航时,要遵循以下原则:
1. 确保遥控器可以控制界内所有的控件。
2. 用上下键控制列表滚动时,当用确认键选中列表的某项时,确保列表仍然可以滚动。
3. 可控元素之间的移动需要简洁和可预测。
为焦点和选择状态提供清晰的显示,可以在drawable文件夹内创建xml文件实现:
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 选择状态 --> <item android:drawable="@drawable/tab_wy_now" android:state_selected="true"/> <!-- 按下状态 --> <item android:drawable="@drawable/tab_wy_now" android:state_pressed="true"/> <!-- 取得焦点状态 --> <item android:drawable="@drawable/tab_wy_now" android:state_focused="true"/> <!-- 悬浮状态 --> <item android:drawable="@drawable/tab_wy_now" android:state_hovered="true"/> <!-- 默认状态 --> <item android:drawable="@drawable/tab_wy"/></selector>
预测用户可能会切换的下一组界面,我们可以提供一个具有提现用户意图的导航。如果当前界面剩余空间很大,考虑吧屏幕分成多面板,可以用Fragment组成带有多个面板的界面。例如:在屏幕左边放置一个包含主标题列表的面板,右边就放置对应的包含副标题列表的面板。
三 TV不支持的功能
相机:android.hardware.camera
导航GPS:android.hardware.location.gps
麦克风:android.hardware.microphone
近场通信(NFC):android.hardware.nfc
通话:android.hardware.telephony
触屏:android.hardware.touchscreen
这些功能通常都是TV所不支持的。
如何设置Android系统不带有触摸功能呢?
在Manifest中配置:
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />就可以安装到不支持的Android系统中。
通常电视是没有内置GPS的,如果你的程序需要用到地理位置信息,那么可以使用“static location provider”得到这些信息,这种方式是通过查询邮编完成的:
LocationManager manager = (LocationManager) .getSystemService(Context.LOCATION_SERVICE); Location location = manager.getLastKnownLocation("static");查出的结果保存在location对象中。
下面是检测当前可用性的代码,来区别是手机还是TV。
if (getPackageManager().hasSystemFeature("android.hardware.telephony")) { Log.i("Mobile Test", "该设备是手机"); } else if (getPackageManager().hasSystemFeature( "android.hardware.touchscreen")) { Log.i("Tablet Test", "该设备不支持通话,但是支持触屏"); } else { Log.i("TV Test", "该设备是TV"); }