转载请注明出处(http://www.cnblogs.com/weizhxa/p/7568090.html )
有不正确,还请大家留言修正!
1、何谓屏幕适配:在任何设备上看起来布局都是近似的,细分也就是控件的比例是基本一致的。由于我们在定义控件的尺寸时一般使用的是dp和sp,所以最终也就是求不同设备上dp和sp的比例。
2、屏幕适配做法:
2.1 总结
2.1.1 根据像素密度进行屏幕适配:目前需要适配的像素密度一般为hdpi、xhdpi、xxhdpi、xxxhdpi;所以先在res文件夹下创建vaelus-hdpi、values-xhdpi、values-xxhdpi、values-xxxhdpi文件夹,并在各文件夹下建立dimen.xml文件;
2.1.2 根据美工所给图确定对应的像素密度(像素密度计算公式:像素密度=√{(长度像素数^2+宽度像素数^2)}/屏幕尺寸,一般美工给图为720p或者1080p,则对应的像素密度一般归为360dpi或者480dpi,即xhdpi和xxhdpi),用给定图中的px尺寸计算美工图所表示的dp尺寸(例如1280x720的美工图中,在图中一个控件的宽为96px,则1dp=2px[dp与px的换算公式如下所示,原理请百度],在values-xhdpi的dimen.xml文件中就可以标注此控件的大小为48dp);如果是文字,同样可以换算为dp(或者sp,sp有缺点,在2.1.4讲述。),换算公式同控件。
2560x1440 1920x1080 1280x720 800x480
xxxhdpi xxhdpi xhdpi hdpi
1dp = 4 3 2 1.5 px
2.1.3 将其它res文件尺寸通过比例关系进行计算,实现尺寸文件;
dp以及sp在不同资源尺寸下的转换公式:
2560x1440 1920x1080 1280x720 800x480
xxxhdpi xxhdpi xhdpi hdpi
dp 宽 1 1 1 5/6=0.833
高 1 1 1 8/9=0.889
sp 宽 1 1 1 5/6=0.833
高 1 1 1 8/9=0.889
sp取中间值 1 1 1 0.85
注释:上表意为:如果美工给了我们1280x720p的图,那么我们在进行尺寸定义时,xxxhdpi、xxhdpi、xhdpi下的dp和sp尺寸都是一致的,hdpi下的尺寸dp的宽需要 *0.833,高需要*0.889,sp需要*0.85,即可获得hdpi下的尺寸文件。
2.1.4 文字使用sp的问题:如果文字使用sp,则当系统字体改变大小时(例如从超大改为标准),字体会跟着变化,我们可以使用dp来消除这种现象。
2.2 分析
2.2.1 首先确定屏幕支持类型,目前一般支持hdpi、xhdpi、xxhdpi、xxxhdpi即可;
2.2.2 根据美工给的图来进行基础作业:美工一般可以给xhdpi或者xxhdpi的图,也就是720或者1080p的图;将美工做的图所标px尺寸换算为dp尺寸,换算公式是xhdpi的px/2,xxhdpi的尺寸PX/3,实现所有页面时的尺寸和文字大小全部放入res的dimen文件夹中;
2560x1440 1920x1080 1280x720 800x480
xxxhdpi xxhdpi xhpid hdpi
1dp = 4 3 2 1.5 px
2.2.3 补齐hdpi、xhdpi、xxhdpi、xxxhdpi下的尺寸文件大小。换算公式如下(注:此公式以1080p或者720p为单位计算):最后在手机上就反应出来控件在任何手机上的宽和高都看起来是比例一样的。
dp比例算法:
dp:将某一尺寸下的数据换算为别的数据公式:
例如美工给图中,设备尺寸为宽d,高e,单位为px,px与dp换算关系为f,某控件宽为x、高为y, 单位为px,则在其它尺寸中,假设目标尺寸设备宽为a,高为b,单位为px,px与dp换算关系为c,假设此控件在此设备的宽为x1、高为y1, 单位为px;
则美工给图的尺寸换算为dp为:
源dp:
宽[dp] k = x/f 宽[百分比] = x/d x=kf
高[dp] l = y/f 高[百分比] = y/e y=lf
目标dp:
宽[dp] = x1/c 宽[百分比] = x1/a
高[dp] = y1/c 高[百分比] = y1/b
为了达到屏幕适配的目的(控件展现效果一致,即宽高基本一致),则有:
x/d = x1/a , y/e=y1/b
则x1 = ax/d , y1 = by/e
则目标dp:
宽[dp] = x1/c = ax/cd
高[dp] = y1/c = by/ce
则目标dp与源dp的换算公式为(k和l分别代表源dp的宽和高):
目标dp:
宽[dp] = ax/cd = akf/cd = k * (af/cd)
高[dp] = by/ce = blf/ce = l * (bf/ce)
带入abcdef则:目标控件的高宽分别为源高宽的:
dp转换公式:
源设备 b a c 目标设备 e d f 宽 高
xxxhdpi: 2560 1440 4 xxhdpi 1920 1080 3 1 1
xhdpi 1280 720 2 1 1
hdpi 800 480 1.5 1.2 1.125
xxhdpi 1920 1080 3 xxxhdpi: 2560 1440 4 1 1
xhdpi 1280 720 2 1 1
hdpi 800 480 1.5 1.2 1.125
xhdpi 1280 720 2 xxxhdpi: 2560 1440 4 1 1
xxhdpi 1920 1080 3 1 1
hdpi 800 480 1.5 1.2 1.125
hdpi 800 480 1.5 xxxhdpi: 2560 1440 4 0.833 0.889
xxhdpi 1920 1080 3 0.833 0.889
xhdpi 1280 720 2 0.833 0.889
所以:基于1080p或者720p的图,计算dp后,直接可用于xxxhdpi、xxhdpi、xhdpi,除以1.2和1.125后分别用于hdpi的高和宽。
sp转换算法公式:
首先我们需要明白sp和px怎么转化:
ppi的运算方式是:
PPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数
dp:Density-independent pixels,以160PPI屏幕为标准,则1dp=1px,
dp和px的换算公式 :
dp*ppi/160 = px。比如1dp x 320ppi/160 = 2px。
sp:Scale-independent pixels,它是安卓的字体单位,以160PPI屏幕为标准,当字体大小为 100%时, 1sp=1px。
sp 与 px 的换算公式:sp*ppi/160 = px
总结得出:
px = dp*ppi/160
dp = px / (ppi / 160)
px = sp*ppi/160
sp = px / (ppi / 160)
dp = sp?
所以我们由上面的dp资源文件比例公式表可以得出结论:
sp在不同资源尺寸下的dimen转换公式:
2560x1440 1920x1080 1280x720 800x480
xxxhdpi xxhdpi xhdpi hdpi
sp 宽 1 1 1 5/6=0.833
高 1 1 1 8/9=0.889
整体 1 1 1 8/9=0.889
实践证明:xxxhdpi、xxhdpi、xhdpi的sp是1:1:1的,但是从这3者转到hdpi时用0.833还是0.889呢?其实取哪一个都是可以的,可以取个中间值0.85就可以了。