【Android Developers Training】 12. 支持不同屏幕
注:本文翻译自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. 支持不同屏幕的更多相关文章
- 【Android Developers Training】 10. 序言:支持不同设备
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 13. 支持不同平台版本
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 11. 支持不同语言
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 70. 使用ViewPager实现屏幕滑动
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 1. 创建一个Android项目工程
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 83. 实现高效网络访问来优化下载
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 19. 序言:通过Fragments构建动态UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 62. 搭建一个OpenGL ES环境
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 60. 在你的UI中显示位图
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- [刷题]算法竞赛入门经典(第2版) 4-2/UVa201 - Squares
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,20 ms) #include<iostream> #include<cs ...
- RowSet的使用
ResultSet是使用Jdbc编程的人入门和常用的操作数据库的类,自 JDK1.4开始,易于使用RowSet接口被引入.RowSet 接口扩展了标准java.sql.ResultSet接口.RowS ...
- Java7中的ForkJoin并发框架初探(下)—— ForkJoin的应用
前两篇文章已经对Fork Join的设计和JDK中源码的简要分析.这篇文章,我们来简单地看看我们在开发中怎么对JDK提供的工具类进行应用,以提高我们的需求处理效率. Fork Join这东西确实用好了 ...
- Exchanger类详解
Exchanger并发辅助类,允许在并发任务之间交换数据.具体来说Exchanger类在两个线程之间定义同步点.当两个线程到达同步点时,它们交换数据结构.需要注意的是Exchanger类只能同步两个线 ...
- Scala基础 - 下划线使用指南
下划线这个符号几乎贯穿了任何一本Scala编程书籍,并且在不同的场景下具有不同的含义,绕晕了不少初学者.正因如此,下划线这个特殊符号无形中增加Scala的入门难度.本文希望帮助初学者踏平这个小山坡. ...
- H5与客户端联调
进行H5移动端开发时,我们可以使用谷歌浏览器的设备工具栏进行,此方法实时方便快速,但这也是有限的,当我们需要在特定机型特定系统或者在webview中调试时,这种方法就显得很吃力了. 安卓: 一.与安卓 ...
- VR大时代-全景智慧城市搭建是一个任重而道远的任务
全景智慧城市搭建是一个任重而道远的任务,但是也促进了实体市场的蓬勃发展与进步.VR技术改变了人们以往的娱乐方式,而全景智慧城市将会彻底改变人们的生活习惯.VR是未来的计算平台,更是人力发展历史中,技术 ...
- jmeter跨线程组传值
在测试过程中,有时候需要jmeter跨线程组传值,jmeter本身又不具备此功能,那么,又该如何实现呢? 其实,我们可以通过BeanShell去实现. 实现过程如下: 1.线程组A中,使用正则表达式提 ...
- React学习小结(三)
一.React数据的传输 1.属性和状态是react中数据传递的载体 2.属性是声明以后不允许被修改的东西 3.属性只能在组件初始化的时候声明并传入组件内部,并且在组件内部通过this.props获取 ...
- HashSet集合
HashSet特点 1.无序,不允许重复(无序指元素顺序与添加顺序不一致,每次遍历出来的位置不是恒久不变的) 2.HashSet通过调用hashCode()和equals方法来剔除重复 3.HashS ...