首页 > 代码库 > 10、TV UI
10、TV UI
? TV UI布局
1. 为大屏幕提供适当的布局源文件。
2. 确保UI在一定距离仍然可以看清。
3. 为高清电视提供高分辨率的图标和图像。
1. 把屏幕上的导航控制菜单放在屏幕的左边或者右边,并且将菜单内容 以垂直的方式显示。
2. 创建那些分段的UI时,通过使用Fragments和GridView来替代 ListView更能充分利用水平空间的视图。
3. 使用RelativeLayout和LinearLayout进行布局。这两种布局使 Android系统能够针对大小,对齐,纵横比,以及屏幕的像素密度来 匹配视图的位置。
4. 在视图控制之间提供足够的余地来避免一个杂乱的用户界面。
左右布局示例
1 <RelativeLayout 2 android:layout_width="fill_parent" 3 android:layout_height="fill_parent"> 4 <fragment 5 android:id="@+id/leftsidecontrols" 6 android:layout_width="0dip" 7 android:layout_marginLeft="5dip" 8 android:layout_height="match_parent" /> 9 <GridView10 android:id="@+id/gridview" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" />13 </RelativeLayout>
? 使文字和控制容易看到
1. 把文本插入用户能够快速地扫描到的小块中。
2. 在一个黑暗的背景中使用明亮的文本.这个风格在一台电视中更方便读。
3. 避免轻量级的字体以及那些要么非常窄要么非常宽的笔画字体.使用简 单的无衬线字体和使用抗混叠来提高可读性。
4. 用密度无关的像素单元而不是绝对的像素单元(dp和sp)。
? 针对高分辨率大屏幕设计
普遍的高清电视显示分辨率是720p 和1080p.把你的UI设置为1080p, 并且允许系统在必要的时候将你的UI分辨率下调到720p.通常下调并不意 味着是缩小你的UI界面(注意反之则不然,你应该避免倍增,因为它会降低 UI质量).
为了获得最佳的图片显示,如果可能的话以9-patch image元素来展示。 在你的布局中如果提供低质量或者小图片的话,它们将会出现像素化,模糊, 或呈颗粒状.对用户来说这不是一个好的用户体验.取而代之的是采用高质 量的图片.
? TV UI导航的设计原则
1. 确保所有的布局都处于按键导航控制之下。
2. 为可视化的导航提供清晰的反馈。
3. 通过合理的布局,使用每一个UI更容易访问。
? 处理按键导航
在电视上,用户使用远程方式导航,例如遥控器或键盘,这就限定了 (屏幕光标)移动方式只有上、下、左、右。因此,要构建一个优秀的应用, 你必须在应用里提供一套用户可以快速学会的导航策略。
当你为遥控器设计导航时,遵循以下几点原则:
1. 确保遥控器可以控制界面在所有的控件。
2. 用上下键控制列表滚动时,当用确认键选中列表的某项时,确保列表 仍然可以滚动。
3. 可控元素之间的移动需要简洁和可预测。
? 下一个焦点控件
Android通常会自动处理布局元素中的导航顺序,所以通常并不需要 担心控件获得焦点的顺序。除非布局非常复杂,或者需要在布局元素之间 特殊移动,也是可以的。例如,现在有一个EditText控件,定义他的下一 个获得焦点的控件,可以设置如下的4个属性。
? 为焦点和选择提供清晰的提示
使用合适的颜色高亮显示被选中的元素,这样让用户很容易就知道哪 个可控元素被选中,另外,建议在整个应用程序中使用统一风格的高亮显 示。 安卓系统针对选中或获取焦点的控件使用Drawable State List Resources 实现高亮显示的效果,例如:
1 <!-- button.xml --> 2 <?xml version"utf-8"?> 3 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 4 <!-- pressed --> 5 <item android:state_pressed="true" 6 android:drawable="@drawable/button_pressed" /> 7 <!-- focused --> 8 <item android:state_focused="true" 9 android:drawable="@drawable/button_focused" /> 10 <!-- hovered -->11 <item android:state_hovered="true" 12 android:drawable="@drawable/button_focused" />13 <!-- default -->14 <item android:drawable="@drawable/button_normal" /> 15 </selector>
1 <Button2 android:layout_height="wrap_content" 3 android:layout_width="wrap_content" 4 android:background="@drawable/button" />
? 设计简易导航
用户通过按尽可能少的键导航到任何一个UI,导航应该简单易懂,对 于稍显复杂的操作,需要提供带帮助功能的按钮、图标,用户一点击就弹 出一个帮助对话框提示用户。
预测用户可能会切换的下一界面,我们可以提供一个(具有体现用户意 图)这样的导航。如果当前界面感觉很稀松,考虑把屏幕分成多面板,可 以用Fragment组成带有多个面板的界面。例如:在屏幕左边放一个包含 主标题列表的面板,右边就放置对应的包含副标题列表的面板。
? TV不支持的功能
? 对于不支持功能的解决方案
安卓系统是默认设备带有触摸屏的,所以如果系统在电视上运行,就 得在配置文件mainfest配置一下,不需要触摸屏:
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
因为电视固定的、室内设备,所以没有内置GPS。如果你的程序需要 用到地理位置信息,要么让用户(联网)查询,要么使用"static location provider" 得到这些信息,这种方式是通过查询邮编完成的。
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation("static");
? 运行时检测功能可用性
if (getPackageManager().hasSystemFeature("android.hardware.telephony")) {
Log.d("Mobile Test", "Running on phone"); }
else if (getPackageManager().hasSystemFeature("android.hardware.touchscreen"))
{
Log.d("Tablet Test", "Running on devices that don‘t support telphony but have a
touchscreen.");
}
else
{
Log.d("TV Test", "Running on a TV!");
}
10、TV UI