android电视优化,Android Developers:针对电视优化布局

当你的应用程序运行在一个电视上的时候,你应该假设用户坐在距离屏幕大约10英寸远的地方。这样的用户环境被作为10-foot UI被引用。为了给你的用户提供一个舒适和愉快的体验,你应该相应的设计和定制你的UI。

这节课程向你展示如何通过以下方式,针对电视优化你的布局:

为横屏模式提供适当的布局资源。

确保文本和控件从一定距离看,足够大保证可见。

为高清电视屏幕提供高分辨率的位图和图标。

设计横屏布局

——————————————————————————————————————————————————————————————

电视屏幕总是在横屏方向,遵循这些提示来为对电视屏幕优化,构建横屏布局:

方式屏幕导航控制在屏幕的左侧或者右侧,为内容节省垂直空间。

分部分创建UI,通过使用Fragment,和使用如GridView视图组替代ListView来更好的利用横向屏幕空间。

使用如RelativeLayout或者LinearLayout视图组排列视图。它允许Android系统针对视图大小调整位置,对齐,长宽比和电视屏幕的像素密度。

在布局控件之间添加足够的边缘来避免一个凌乱的界面。

例如,下面的布局是针对电视优化的:

0818b9ca8b590ca3270a3433284dd417.png

在这个布局中,控制控件在左侧。UI被现实在一个GridView中,它完美适应横屏方向。在这个布局中,GridView和Fragment的宽度和高度都是设置为动态的,所以它们能适应屏幕的分辨率。控制控件在运行时动态的添加到左侧。这个UI的布局文件是red/layout-land-large/photogrid_tv.xml。(这个布局文件被放置在layout-land-large是因为电视拥有横向的大屏幕。更多信息查阅Supproting Mutiple Screens。)

res/layout-land-large/photogrid_tv.xml

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

android:id="@+id/leftsidecontrols"

android:layout_width="0dip"

android:layout_marginLeft="5dip"

android:layout_height="match_parent" />

android:id="@+id/gridview"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

wie了在屏幕的左侧设置Action Bar选项,你也可以在你的应用程序中包含Left navigation bar library,来在屏幕的左侧设置Action选项,替代使用一个自定义的Fragment来添加控制控件:

LeftNavBarbar=(LeftNavBarService.instance()).getLeftNavBar(this);

当你有一个内容垂直滑动的Activity的时候,总是使用左侧导航栏;另一方面,你的用户必须滑动到内容的顶端,在内容视图和ActionBar之间进行切换。看Left navigation bar sample app,看到如何在你的应用中简单包含左导航栏。

使文本和控件容易看见

——————————————————————————————————————————————————————————————

在一个电视应用界面中的文本和控件,应该在一定距离内容易被看见和导航。遵循下面的这些提示是它们在一定的距离内更容易被看见:

精简文本,使用户能快速的扫描。

在一个黑暗的背景中使用高亮的文本。这种样式在电视中更容易阅读。

避免轻量级的字体,或者字体非常窄和粗。使用简单的sans-serif字体和anti-aliasing来郑强可读性。

使用Android的标准字体大小:

android:id="@+id/atext"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="center_vertical"

android:singleLine="true"

android:textAppearance="?android:attr/textAppearanceMedium"/>

确保你的视图组件对于坐在屏幕前10英寸(这个距离对于更大的屏幕会更大)远的用户,足够大至清晰可见。这样做的最好方式是使用相对布局大小而不是绝对大小,并且使用基于密度的像素单位替代绝对像素单位。例如,为了设置一个控件的宽度,使用wrap_content替代像素尺寸,并且设置控件的边距,使用dip替代像素值。

针对高密度大屏幕设计

——————————————————————————————————————————————————————————————

常见的HDTV显示分辨率是720p,1080i和1080p。针对1080p设计你的UI,然后如果又必要的话,允许Android系统缩放你的UI适应720p。通常,缩减(移除像素)不会降低UI(注意到反过来是不正确的;你需要避免放大,应为它降低UI的质量)。

为了获取图片最好的缩放结果,如果可能以9-patch提供图片。如果你在你的布局中使用低质量的图片或者小图片,它们将出现模糊或者颗粒状。这对于用户来说是不好的体验。使用高质量的图片替代。

更新关于针对大屏幕优化应用的信息,查阅Designing for multiple screens。

设计处理较大的位图

——————————————————————————————————————————————————————————————

Android系统有内存大小的限制,所以在你的应用中下载和存储高分辨率的图片,会经常导致内存溢出错误。为了避免这个,遵循下面的这些提示:

仅仅在当它们被显示的时候加载图片。例如,当在一个GridView或者Gallery中显示多张图片的时候,当在视图的Adatper中的getView()被调用的时候仅仅加载一张图片。

在不在使用的Bitmap视图上调用recyle()。

在一个内存集合中使用WeakReference存储Bitmap对象的引用。

如果从网络获取图片,使用AsyncTack获取它们,并且在SD卡上保存它们用于快速访问。不要在应用程序的UI线程中进行网络传输。

当你下载它们的时候,缩小很大的图片到一个合适的大小;另一方面,下载图片本身可能导致“内存溢出”异常。下面的例子当下载的时候缩小图片:

// Get the source image's dimensions

BitmapFactory.Options options = new BitmapFactory.Options();

// This does not download the actual image, just downloads headers.

options.inJustDecodeBounds = true;

BitmapFactory.decodeFile(IMAGE_FILE_URL, options);

// The actual width of the image.

int srcWidth = options.outWidth;

// The actual height of the image.

int srcHeight = options.outHeight;

// Only scale if the source is bigger than the width of the destination view.

if(desiredWidth > srcWidth)

desiredWidth = srcWidth;

// Calculate the correct inSampleSize/scale value. This helps reduce memory use. It should be a power of 2.

int inSampleSize = 1;

while(srcWidth / 2 > desiredWidth){

srcWidth /= 2;

srcHeight /= 2;

inSampleSize *= 2;

}

float desiredScale = (float) desiredWidth / srcWidth;

// Decode with inSampleSize

options.inJustDecodeBounds = false;

options.inDither = false;

options.inSampleSize = inSampleSize;

options.inScaled = false;

// Ensures the image stays as a 32-bit ARGB_8888 image.

// This preserves image quality.

options.inPreferredConfig = Bitmap.Config.ARGB_8888;

Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(IMAGE_FILE_URL, options);

// Resize

Matrix matrix = new Matrix();

matrix.postScale(desiredScale, desiredScale);

Bitmap scaledBitmap = Bitmap.createBitmap(sampledSrcBitmap, 0, 0,

sampledSrcBitmap.getWidth(), sampledSrcBitmap.getHeight(), matrix, true);

sampledSrcBitmap = null;

// Save

FileOutputStream out = new FileOutputStream(LOCAL_PATH_TO_STORE_IMAGE);

scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);

scaledBitmap = null;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值