严格来说,作为读者,你应该带着批判性质的眼光来看这篇文章,此文章依据本人对Android官方开发资料《Supporting Multiple Screens》的阅读、实践以及和开发人员的沟通形成,内容更多为目前盆地个人理解的总结。

一、Android支持的多种屏幕

传统意义上,一般是是这么认为的:

ldpi: 对应分辨率240×320

mdpi: 对应分辨率320×480

hdpi:对应分辨率480×800或480×854

但实际上没有这么简单,直接看官方资料的下标,可以看到其实ldpi一样由480×800,甚至还有1024×600

 低密度(ldpi 120)中密度(mdpi 160)高密度(hdpi 240)超高密度(320 xhdpi)小屏幕QVGA (240×320) 480×640 中屏幕WQVGA400 (240×400)
WQVGA432 (240×432)HVGA (320×480)WVGA800 (480×800)
WVGA854 (480×854)
600×1024640×960大屏幕WVGA800** (480×800)
WVGA854** (480×854)WVGA800* (480×800)
WVGA854* (480×854)
600×1024  超大屏幕1024×600WXGA (1280×800)
1024×768
1280×7681536×1152
1920×1152
1920×12002048×1536
2560×1536
2560×1600

二、如何分辨是ldpi、mdpi、hdpi?

为什么要分辨率ldpi、mdpi、hdpi?我的理解,是为了要在不同的屏幕密度下取得最好的显示效果。

从上一段来看,通过分辨率来看并不是很靠谱,那怎么样才靠谱?其实,只要我们知道屏幕分辨率、屏幕尺寸(对角线长度),就可以算出相应的屏幕密度,从而根据其范围得出属于那种屏幕密度。

我们可以根据长或者根据宽来计算出dpi,计算公式为:

dpi=宽/((尺寸^2 * 宽^2)/(宽^2 + 高^2))^(1/2)

= 长/((尺寸^2 * 长^2)/(宽^2 + 高^2))^(1/2)

此计算公式可以在excel中予以计算。

大概计算方法如下,以宽为例:

1.比如分辨率为320×480,则长宽比为1:1.5

2.比如屏幕尺寸为3.6”,则根据勾股定理,”长^2+宽^2=3.6^2″,即”宽^2+2.25*宽^2=12.96″,得出”宽^2=12.96/3.25″,则”宽=(12.96/3.25)^(1/2)= 1.9969″

3.宽为320px,分布在1.9969”上,因此密度为320/1.9969=160.2467

4.因此此密度为mdpi的密度

注:

1.此部分参考文章为:http://blog.sina.com.cn/s/blog_7377a8a20100qydh.html

2.两款计算dpi的应用

https://market.android.com/details?id=appinventor.ai_wenjiun1024.DPICalculato

https://market.android.com/details?id=com.andy.dpi

三、粗略的分辨率ldpi 、mdpi、hdpi

套用老资料,其实传统意义上的通过分辨率判断手机dpi,还是比较靠谱的:

ldpi: 对应分辨率240×320

mdpi: 对应分辨率320×480

hdpi:对应分辨率480×800或480×854

为什么呢?因为ldpi如果要是320×480,则需要4.8寸的屏幕,如果是480×800,则需要7.8寸的屏幕,如果mdpi是480×800,则需要5.2寸的屏幕,一般的手机屏幕不会这么大,所以还算靠谱。

当然,如果是分辨android pad的dpi,建议还是算一下吧。

四、如何适配之9-patch?

官方资料:http://developer.android.com/guide/developing/tools/draw9patch.html

简单来说,如果你的图片资源是可以拉伸的而不会变形或者模糊的,则完全可以使用9-patch的格式,而不用为不同的dpi提供不同的图片资源。

此格式经常用在背景性质的图片资源中。

android开发包提供了9-patch的制作工具,上方的划线指明横向可以拉伸的区域,左方的划线指明纵向可以拉伸的区域,下方的划线指明水平居中的区域,右方的划线指明垂直居中的区域。

在盆地的理解中,一般提供hdpi大小的图片,并制作为9-patch格式,此时的拉伸在mdpi、ldpi上基本都不会带来问题。

这部分网上有不少资料,这里就不再赘述了,上述的描述是为了盆地日后便于想起和理解。

五、如何适配指图标和其他图片

除了指明拉伸区域拉伸不变形的图片外,类似图标或者其他会变形的图片资源,最佳情况下需要分别针对不同的dpi提供不同的图片。

此处特别需要注意的是,假设不考虑xhdpi的支持,hdpi、mdpi、ldpi的支持,需要考虑相应的比例,即1.5:1:0.75,需要在相应比例关系下保持整数的像素值,否则可能会产生模糊的情况。

举个具体例子,某个图标在hdpi下大小为48×48,则mdpi和ldpi下分别为32×32和24×24,如果此图标在hdpi设定为50×50,则mdpi下50无法整除1.5,因此mdpi下图标不论图标设定为33×33还是34×34都会模糊(可能独立指定可以避免此情况,此部分不太了解)。

六、菜单图标和应用图标

这一部分在官方资料中描述的很全面,只是不少应用开发者没有按照规范来,比如桌面图标的在hdpi上分辨率虽然定义的是72×72,但实际上应该只占60×60(如果是正方形,则应该是56×56),而不少应用直接把图标设定为72×72,所以会发现android中很多图标比系统的图标大一些,就是这个缘故。

这一部分就直接参照官方文档吧,做法上也就是做三份,只是需要遵照文档来。

http://developer.android.com/guide/practices/ui_guidelines/icon_design.html

七、小结

作为产品人员,了解这个的目的,是为了向UI人员协调相应的UI资源,以及和开发保持顺畅的沟通,如果不了解这个,可能事倍功半,所以,作为产品人员,还是了解下吧。



术语和概念 
屏幕尺寸 
屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如 2.8寸, 3.5寸)。 
简而言之, Android把所有的屏幕尺寸简化为三大类:大,正常,和小。 
程序可以针对这三种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不需要程序员用代码来干预的。

屏幕长宽比 
屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源分类符long和 notlong。

分辨率 
屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕长宽比。在 Android系统中,程序一般并不直接处理分辨率。

密度 
以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。 
密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕通常则会有很多 ——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定义的界面元素(比如一个按钮),在低密度的屏幕上会 显得很大,但在高密度的屏幕上则会显得很小。

密度无关的像素( DIP ) 
指一个抽象意义上的像素,程序用它来定义界面元素。它作为一个与实际密度无关的单位,帮助程序员构建一个布局方案(界面元素的宽度,高度,位置)。 
一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为 160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,“透明地”处理所 有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式: pixels = dips * (density / 160)。举个例子,在 DPI为 240的屏幕上, 1个 DIP等于 1.5个物理像素。我们强烈推荐你用 DIP来定义你程序的界面布局,因为这样可以保证你的 UI在各种分辨率的屏幕上都可以正常显示。

为了简化程序员面在对各种分辨率时的困扰,也为了具备各种分辨率的平台都可以直接运行这些程序, Android平台将所有的屏幕以密度和分辨率为分类方式,各自分成了三类: 
·三种主要的尺寸:大,正常,小; 
·三种不同的密度:高( hdpi),中( mdpi)和低( ldpi)。 
【DPI是“dot per inch”的缩写,每英寸像素数。】
如果需要的话,程序可以为各种尺寸的屏幕提供不同的资源(主要是布局),也可以为 各种密度的屏幕提供不同的资源(主要是位图)。除此以外,程序不需要针对屏幕的尺寸或者密度作出任何额外的处理。在执行的时候,平台会根据屏幕本身的尺寸 与密度特性,自动载入对应的资源,并把它们从逻辑像素( DIP,用于定义界面布局)转换成屏幕上的物理像素。


手机常见分辨率:

4:3
VGA     640*480 (Video Graphics Array)
QVGA  320*240 (Quarter VGA)
HVGA  480*320 (Half-size VGA)
SVGA  800*600 (Super VGA)

5:3
WVGA  800*480 (Wide VGA)

16:9
FWVGA 854*480 (Full Wide VGA)
HD        1920*1080 High Definition
QHD     960*540
720p    1280*720  标清
1080p  1920*1080 高清

手机:
iphone 4/4s    960*640 (3:2)
iphone5         1136*640
小米1             854*480(FWVGA)
小米2             1280*720

分辨率对应DPI
"HVGA    mdpi"

"WVGA   hdpi "
"FWVGA hdpi "
"QHD      hdpi "
"720P     xhdpi"
"1080P   xxhdpi "




应用程序图标 (Icon)应当是一个 Alpha 通道透明的32位 PNG 图片。由于安卓设备众多,一个应用程序图标需要设计几种不同大小,如:
LDPI (Low Density Screen,120 DPI),其图标大小为 36 x 36 px。
MDPI (Medium Density Screen, 160 DPI),其图标大小为 48 x 48 px。
HDPI (High Density Screen, 240 DPI),其图标大小为 72 x 72 px。
xhdpi (Extra-high density screen, 320 DPI),其图标大小为 96 x 96 px。

 

建议在设计过程中,在四周空出几个像素点使得设计的图标与其他图标在视觉上一致,例如,
96 x 96 px 图标可以画图区域大小可以设为 88 x 88 px, 四周留出4个像素用于填充(无底色)。
72 x 72 px 图标可以画图区域大小可以设为 68 x 68 px, 四周留出2个像素用于填充(无底色)。
48 x 48 px 图标可以画图区域大小可以设为 46 x 46 px, 四周留出1个像素用于填充(无底色)。
36 x 36 px 图标可以画图区域大小可以设为 34 x 34 px, 四周留出1个像素用于填充(无底色)。

 

更多内容可以参考 Android Icon 设计规则:

http://developer.android.com/guide/practices/ui_guidelines/icon_design_launcher.html

 

Launcher  36 x 36 px  48 x 48 px  72 x 72 px

Menu  36 x 36 px  48 x 48 px  72 x 72 px

Status Bar  24 x 24 px  32 x 32 px  48 x 48 px

Tab  24 x 24 px  32 x 32 px  48 x 48 px

Dialog  24 x 24 px  32 x 32 px  48 x 48 px

List View  24 x 24 px  32 x 32 px  48 x 48 px


DisplayMetrics metric = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metric); 
int width = metric.widthPixels;  // 屏幕宽度(像素) 
int height = metric.heightPixels;  // 屏幕高度(像素) 
float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5) 
int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)