注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接:http://developer.android.com/training/basics/supporting-devices/screens.html


Android通过两种参数来对屏幕进行分类:屏幕尺寸和分辨率。在开发时,应该将这两个因素同时考虑进去,所以你应该将项目包含一些可选择的资源文件,使得你的应用在不同的屏幕尺寸和分辨率上都能具有最佳的体验。

  • 概括地来说,一共有四种尺寸:小,标准,大,超大。
  • 概括地来说,一共有四种分辨率:低(ldpi),中(mdpi),高(hdpi),超高(xhdpi)

为了声明你希望在不同的屏幕使用不同的布局和位图,你必须分别在不同的资源放置这些可选择使用的资源,这和你为了支持不同语言所做的工作比较类似(参见上一篇博客:http://www.cnblogs.com/jdneo/p/3446617.html

另外需要注意的是,屏幕的方向:横屏(landscape)或竖屏(portrait)也是一种屏幕尺寸的变化,所以许多应用为了优化用户体验,会为每一个方向调整布局。

一). 创建不同的布局

为了在不同屏幕尺寸上获得最佳的用户体验,你应该为你希望支持的每一个屏幕尺寸分别创建一个XML布局文件。每一个布局应该存储在相应的资源目录中,以“-<screen_size>”作为名称后缀。例如,对应于大尺寸屏幕的的布局应该存放在“res/layout-large/”这一目录下。

Note:

Android会为了适当地适应屏幕自动调整你的布局。所以在你对应于不同屏幕尺寸的布局中,不需要担心UI元素的绝对尺寸,而应该关注影响用户体验的布局结构(比如一些重要UI元素相对于其他元素的相对尺寸和相对位置)

例如,以下项目包含一个默认布局和一个对应于大尺寸屏幕上的布局:

MyProject/
res/
layout/
main.xml
layout-large/
main.xml

文件的名字必须完全一致,但是为了为对应尺寸的屏幕提供最优化的UI,每个文件的内容是不同的。

而在应用中,对布局文件的引用不需要改变:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

系统会根据运行该应用的设备的屏幕尺寸,从相应的目录下加载布局文件。学习Android如何选取恰当的资源,可以阅读:Providing Resources

作为另一个例子,以下是一个包含了横屏布局的项目工程的目录结构:

MyProject/
res/
layout/
main.xml
layout-land/
main.xml

默认地,文件“layout/main.xml”被用于竖屏。

如果你想在大屏幕设备上提供横屏布局,你需要同时用到“large”和“land”适配符:

MyProject/
res/
layout/ # default (portrait)
main.xml
layout-land/ # landscape
main.xml
layout-large/ # large (portrait)
main.xml
layout-large-land/ # large landscape
main.xml

Note:

Android 3.2及以上版本的系统可以通过一种更高级的方法来定义屏幕尺寸,这使你可以通过dip(density-independent pixels)来特定资源相对于屏幕大小的最小宽度和高度。更多信息可以阅读:Designing for Multiple Screens

二). 创建不同的位图

你应该为不同的分辨率密度的屏幕(低,中,高,超高)提供相应的资源文件。这可以帮助你在不同的屏幕上,获取优秀的图像质量性能表现。

为了创建这些图像,你应该使用下述的尺寸参数将原始矢量图的尺寸进行放大或缩小:

  • xhdpi:2.0
  • hdpi:1.5
  • mdpi:1.0(基准)
  • ldpi:0.75

这意味着如果你为一个xhdpi的设备生成了一幅200x200的图像,那么hdpi对应的150x150,mdpi对应的是100x100,ldpi对应的是75x75。

之后把这些文件放在相应的图像资源目录:

MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png

一旦你引用了文件:“@drawable/awesomeimage”,系统会根据屏幕的规格自动地选择相应的图像文件。

Note:

ldpi的资源并不一定一直是必须的。当你提供了hdpi的资源,系统会将它缩小一半来匹配ldpi的屏幕

有关创建应用图标集的信息,可以阅读:Iconography design guide

【Android Developers Training】 12. 支持不同屏幕的更多相关文章

  1. 【Android Developers Training】 10. 序言:支持不同设备

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 13. 支持不同平台版本

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 11. 支持不同语言

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 70. 使用ViewPager实现屏幕滑动

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 1. 创建一个Android项目工程

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 83. 实现高效网络访问来优化下载

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 19. 序言:通过Fragments构建动态UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 62. 搭建一个OpenGL ES环境

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 60. 在你的UI中显示位图

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary

    题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...

  2. mysql语句优化总结(一)

    Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A.     inner join内连接也叫等值连接是,left/rightjoin是外连接. SELECT A.id,A.nam ...

  3. 为Android内核添加新驱动

    转载地址:http://blog.chinaunix.net/uid-16759545-id-4892379.html 1. 在drives目录下添加hello目录,内含hello.c Kconfig ...

  4. React入门---基础知识-大纲-1

    -----------------在慕课网学习react入门笔记-------------- ---------博主边学边记录,手把手进行学习及记录---------- --------------- ...

  5. Plupload上传插件自定义图片的修改

    若自定义的一个上传图片效果,代码(可能不全),当用户再次点击所有或任意一个上传图片的input时,uploader.files已经多了客户再次上传的图片,但是你就想要最后的两张图片,这就可以使用到up ...

  6. XSS研究2-来自内部的XSS攻击的防范

    引入: 前面我们分2篇文章分别探讨了来自外部的XSS攻击和来自内部的XSS攻击,现在我们来专门探讨如何防范来自内部的XSS攻击.   实践:  http://www.cnblogs.com/crazy ...

  7. 开涛spring3(6.9) - 对JDBC的支持 之 7.1 概述

    7.1  概述 7.1.1  JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTes ...

  8. SVN如何迁移到Git?

    最近在使用华为软件开发云进行开发项目管理,目前华为软件开发云支持500M的免费项目空间,而且还可以在线编译和构建,不用担心开发环境和生产环境的不同,很好的体现了DevOps的开发理念. 之前一直是用s ...

  9. 使用wamp扩展php时出现服务未启动的解决方法

    今天在使用wamp扩展php的插件时,出现了如下图所示的错误提示 网上查了查,都说是端口原因,修改Apache的 80端口,但是并没有解决问题. 最后我终于找到了解决方法,步骤很简单,如下: 首先,在 ...

  10. 数据库插入数据失败,log提示不能将值 NULL 插入列 'id'

    已经记不住具体的log信息了,意思就是ID如果没有设置为自增长的情况下就不能插入数据,而建表时ID字段是设置为"not null",所以就不能顺利插入数据. 解决方法有两种: ①建 ...