一些基本概念:
1.Screen size: 屏幕尺寸
实际的物理尺寸,屏幕对角线的长度,单位为英寸
2.Screen density :屏幕密度
屏幕上某个区域的像素数量,常用DPI描述。DPI(dots per inch)每英寸的“点”(像素)
一个低密度的屏幕具有的像素比高密度的屏幕要少。
3.Resolution :分辨率
屏幕上物理像素的总数。
计算一个手机的Screen density:
比如一个手机的分辨率为720*1280,屏幕尺寸为4.3寸,那么它对角线上的像素数是720×720 + 1280 * 1280再开根约等于 1468.60,DPI就是1468.60/4.3 约等于341.5
4.Density-independent pixel (dp) 密度无关像素
dp和像素(px)的换算公式:px = dp * (dpi / 160).
160dpi: 1 px = 1 dp
240dpi: 1.5 px = 1dp
Android提出了广义的(generalized )概念,它将尺寸和密度各分为4个种类。
广义的尺寸Generalized size:small, normal, large, xlarge
广义的密度Generalized density:ldpi (low), mdpi (medium), hdpi (high), xhdpi (extra high)
每个广义尺寸和广义密度是有一定范围的,并不是一个确定的值。2个手机有可能广义的尺寸都是normal,但是他们的实际尺寸不一样。广义密度也是同理。Android系统会自动处理这种差别,将他们抽象到4个广义尺寸中的1个内。所以对开发者来说,提供的资源符合广义的尺寸和密度范围就行,不必太纠结于具体的大小。下图指出了android对这种差异的处理:上面是实际的尺寸和密度,下面的是广义的尺寸,密度的范围。
官方guide给出了一个每个广义屏幕尺寸的分辨率的最小范围,用dp表示,设计布局的时候可以参照这个:
xlarge screens are at least 960dp x 720dp
large screens are at least 640dp x 480dp
normal screens are at least 470dp x 320dp
small screens are at least 426dp x 320dp
开发app时,几个基本的原则如下:
在xml布局中使用wrap_content, fill_parent,dp来定制大小
不用px和绝对布局
根据不同的屏幕密度提供图片
资源修饰符:
像layout-small,layout-land这种-后缀的形式,称为资源修饰符,系统会根据最适合的修饰符文件夹去它下面寻找资源,比如大密度的手机就去hdpi下加载资源。如果没有符合当前密度和尺寸的资源,系统会找到默认的资源进行缩放,所谓默认,就是不带资源修饰符的文件夹,比如drawable。系统将默认资源作为基准(
normal screen size,medium density)。
android官网上给出了一张表格说明资源修饰符的应用场景:
对于图片资源,系统一样会进行缩放,不过为了更精确显示防止失真,可以每个文件夹下都做好一组图片。不同密度的图片缩放比例示意图:
它们保持3:4:6:8的比例,举例来说,如果将48×48的图片作为基准的话,ldpi,hdpi,xhdpi的大小分别是36×36,72×72,96×96。
系统根据资源修饰符匹配资源的机制说明:
举例来说,比如一个应用的res目录下有以下的drawable文件夹:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
安装应用的手机的系统参数:
语言:英文
屏幕方向:Port垂直
屏幕密度:hdpi
触摸类型:notouch
输入类型:12key
系统最后选择了资源文件夹drawable-en-port的资源文件。
选择的步骤:
1.排除和系统配置不符合的
系统是英文的语言设置,drawable-fr-rCA/是法文的,所以被排除在外。
2.根据表格列出的优先顺序选择最符合的资源文件夹,表格在这个地址 http://developer.android.com/guide/topics/resources/providing-resources.html#table2
3,4.查找有没有符合表格中列出的条件的文件夹,有的话,排除其他不符合的文件夹,没有的话,继续往下遍历表格,即重复步骤2。
这样说比较拗口,拿上面举例来说,系统会先检查有没有资源文件夹包含MCC , MNC修饰符的,发现没有,然后就查找有没有包含语言和地区的,发现
drawable-en/,drawable-en-port/和drawable-en-notouch-12key/有,所以其他的文件夹都被排除了。
5:一直重复2-4的步骤,表格中有个Screen orientation,所以drawable-en/,drawable-en-port/和drawable-en-notouch-12key/中选出drawable-en-port/作为加载资源的文件夹。至于drawable-en-notouch-12key/,虽然它在表格中符合的条件比前者多,但是Touchscreen type优先级比Screen orientation低,所以也被排除了。
整个匹配过程如下图所示:
参考: http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch
http://developer.android.com/guide/practices/screens_support.html