http://my.oschina.net/wangjunhe/blog/98739
如有理解错,希望被指出
单位杂谈:
px(pixel) 屏幕像素
dip(density-independent pixel) 设备独立像素,缩写为dp,可以理解为另外一种标识像素的单位,它与像素存在以下关系:
dip/pixel = dpi/160 => dip = dpi*pixel/160=> px = dp * (dpi / 160) 当dpi=160时 dip=px
屏幕对角线的长度代表手机的尺寸。
dpi(dot per inch) 表示每英寸像素点有多少,也可以认为是每英寸像素密集度,我们所说的density其实是dpi的估算值,比如165的dpi认为是160的density。
基准线是160dpi
dpi计算:
比如:计算WVGA(800*480)分辨率,3.7英寸的密度DPI,如图1所示
图1
Diagonal pixel表示对角线的像素值(=),DPI=933/3.7=252
根据上面的计算方案,下面计算得出:
QVGA(240X320) 2.7inch 148dpi ldpi
HVGA(320x480) 3.2inch 180dpi mdpi
QVGA(ADP2)(320X480) 3.2inch 180dpi mdpi
WQVGA(240x400) 3.3inch 141dpi ldpi
WQVGA(240x432) 3.4inch 145dpi ldpi
FWQVGA(480x854) 3.7inch 265dpi hdpi
WXGA(1280x720) 4.7inch 312dpi xhdpi
WVGA(480x800) 5.1inch 183dpi mdpi
FWVGA(480x854) 5.4inch 181dpi mdpi
Nexus One(480x720) 3.7inch 270dpi hdpi
Nexus S(480x800) 4.0inch 233dpi hdpi
从上可见,dpi是由屏幕分辨率和屏幕尺寸一起决定的。
为不同的语言和硬件创建资源:
利用目录结构描述,你可以为指定的语言、地点、硬件配置创建不同的资源。在运行时,安卓利用它自己的动态选择机制动态选着这些值。
在res文件夹内,你可以通过使用一个平行的目录结构指定可选择的资源值。连字符“-”被用来分离指定条件的修饰符。
先举个跨语言的例子:
res/
values/
strings.xml
values-fr/ 法国人
strings.xml
values-fr-rCA/ 法裔加拿大人
strings.xml
下面列出可用的资源值修饰符:
1.Mobile Country Code(MCC 移动国家编码) 和 Mobile Newwork Code(MNC 移动网络编码)
国家和可选择的网络取决于你当前所使用的SIM卡,MCC:mcc+3个代表国家的数字编码,MNC:mnc+2个代表网络的数字编码,举个例子:mcc234-mnc20,你可以找到这些编码在http://en.wikipedia.org/wiki/MobileNetworkCode.
2.语言和区域
语言根据ISO 639-1 指定2个小写字母作为代表,紧接着可选择的区域先以r开头(region)然后根据ISO 3166-1-alpha-2 语言编码,也是2个字母不过是大写,还是举个例子吧:
en(英语),en-rUS(美国英语),en-rGB(GB不知道是哪个国家~。~,大家可以去查找通过维基百科)
3.最小的屏幕宽度
以sw<Dimention value>dp的格式(比如sw600dp,sw320dp…)来指定最小的设备尺寸(宽和高)。那为什么说是最小屏幕宽度?考虑到横竖屏,实质就是宽高的较小值。
用在提供多个布局,安卓选择最接近但是不超过当前屏幕尺寸。
4.有效的屏幕宽度
以w<Dimention value>dp 来表示最小的设备屏幕宽度,比如:w600dp,w320dp,w720dp等,同样也是为了支持多个布局选择,不同于最小的屏幕宽度,有效的屏幕宽度
它跟当前的屏幕宽度做对比(比如当前是横屏的屏幕宽度),安卓选择最接近但是不超过当前屏幕尺寸。
5.有效的屏幕高度
与有效的屏幕宽度类似,表示方法以h<Dimension value>dp.
6.屏幕尺寸
实用大致对照表:
屏幕 宽度 高度 尺寸 大小 密度
Type (Pixels) (Pixels) Range (inches) Size Group
QVGA 240 320 2.6 - 3.0 Small Low
WQVGA 240 400 3.2 - 3.5 normal Low
FWQVGA 240 432 3.5 - 3.8 normal Low
HVGA 320 480 3.0 - 3.5 normal Medium
WVGA 480 800 3.3 - 4.0 normal High
FWVGA 480 854 3.5 - 4.0 normal High
WVGA 480 800 4.8 - 5.5 large Medium
FWVGA 480 854 5.0 - 5.8 large Medium
大约 2~3 inch 为 small, 3~4 inch 为normal,4~6inch 为large, 大于6为xlarge
因为每个屏幕类型都有不同的尺寸(比如QVGA可能有2~3个尺寸),在平板电脑里更常见,比较好的方式是用前面提到的最小的屏幕宽度和有效的屏幕宽度(高度)来更精确的指定,安卓在检测layout的修饰符,会优先考虑后者。
7.屏幕的方向
port(portrait)、land(landscape)、square(square)
8.Dock Mode 所谓的底座模式?
car(行车模式)、desk (断开底座)
9.Night Mode
这个用来指定是否是夜间模式,night或者notnight,以此我们可以修改一个theme或者color theme来达到效果
10.屏幕像素密度(dpi)
最佳实践方式:给ldpi(120dpi),mdpi(160dpi),hdpi(240dpi),xhdpi(320dpi) 都指定对应的图片资源。
然而你也可以指定nodpi表示不去适配dpi。同样安卓也是选择最接近当前设备dpi的Drawables文件夹。
11.触屏类型
notouch、stylus、finger
12.键盘有效性
One of keysexposed, keyshidden, or keyssoft.
13.键盘输入类型
One of nokeys, qwerty, or 12key.
14.导航键有效性
One of navexposed or navhidden.
15.UI导航类型
nonav,dpad,trackball,wheel
16.平台版本
target API Level, 以v<API level> 比如v7. 用来限制资源只能跑在指定API或者更高的设备上。
你可以为任何资源指定多个修饰符,然后以- 分开,任何混合写法都是支持的,但是只能是上面列出的修饰符,还有一点就是每种修饰符只能出现1次。
合法的
layout-large-land
layout-xlarge-port-keyshidden
layout-long-land-notouch-nokeys
非法的
values-rUS-en (out of order)
values-rUS-rUK (multiple values for a single qualifier)
注意:安卓如果找不到合适的资源文件夹将会报错,所以通常你需要指定一个默认的文件夹(没有任何修饰符的)。