相对习惯web的px,手机上面的屏幕适配和长度单位都比较多。
以前也没有仔细留意这些,我自己的手机是多少从没有关心过。
这回做一个全面的调查,一般目标都是达到 实用导向的 专家级别。
在Android应用的开发过程中,我们往往需要设置组件,字体等尺寸,这个时候就需要制定计量单位。在Android中使用到的计量单位主要有px, pt, dp, dip, sp等,这些计量单位表示什么尺寸,之间有何区别?
屏幕大小:以屏幕对角线的物理长度来衡量屏幕的大小
分辨率:屏幕中所有物理像素点数。如320x480,就表示宽方向有320个像素,高方向有480个像素,整个屏幕有153,600个像素。
屏幕密度:dpi(dots per inch),即像素密度,每英寸面积上存在多少个像素。160dpi表示单位面积上有160个像素,240dpi表示单位面积上有240个像素。 屏幕的密度是由分辨率和屏幕大小(物理尺寸)决定的,320x480的分辨率在3寸的屏幕上与6寸的屏幕上密度是不同的。
dp(dip, Desity-independent pixel):密度无关像素,在Android中经常使用。android将160dp作为一个标准(即单位面积上有160个像素点时),此时1dp=1px;当将1dp放到240dp的屏幕上去时,android就会自动将1dp调整为1.5px的大小。而在美工给出的高保真一般是px,要根据给出的高保真的密度,换算到dp, 公式:
px = dp * (dpi / 160)
android将所有的密度泛化为:ldpi, mdpi, hdpi。
将屏幕大小泛化为small, normal, large, xlarge(extra large)。
华为荣耀4核的参数如下(from jd):
屏幕尺寸4.5英寸
分辨率1280×720 HD高清,326PPI
(看看,这里用的326PPI其实就是pdi,Pix Per Inch -- ppi,google居然这么写Dots Per Inch -- dpi)
一般手机就只说屏幕的尺寸,即对角线的英寸数值,不说屏幕的长和宽。
如果我能知道场合宽的比例,即根据 长*宽=面积( l*w=s ),可以算出来长和宽。
长和宽的比例,其实手机的参数也写明了:
根据这个也可以看出来长宽比(因为像素是等大小的,根据等比例可以推知:长宽的像素个数比即长宽比)
我又查了查业界的大概情况:能手机的屏幕一般的长宽比例是多少呢?
一般有16:9和16:10两种。 16:9比如LG 2X、LG LTE等,分辨率为800*480、1280*720等; 16:10比如iphone4、iphone4S、魅族M9、魅族MX等,分辨率为960*540。 我用的是16:9的LG LTE,这种比例好处是看电影比较好,一般的16:9电影可以满屏全比例播放;缺点就是没有16:10的手机看上去好看,会显得比较长一些。
知道了长度,长宽比,像素密度,那么,来算算pdi==ppi
屏幕尺寸4.5英寸
分辨率1280×720 HD高清
怎么计算简单呢?需要去计算屏幕以inch为单位的面积么?
根据等比原则,只要计算对角线的比例既可以了。
分辨率的对角线,(我的脑子还是有点儿问题,居然不能转换ruby的平方到平方根):
1.9.3p194 :007 > ( (1280**2) + (720**2) ) ** (1/2.0)
=> 1468.6047800548656
对角线的比例,即面积比:
1.9.3p194 :008 > ( (1280**2) + (720**2) ) ** (1/2.0) / 4.5
=> 326.35661778997013
可以看出这里的326PPI 是四舍五入的结果。yea!
即单位inch的面积上有326这么多的像素。
实际的计算
实际开发android中或者cocos2d等游戏的时候就得关注此等计算了。
dp:android将160dp作为一个标准(即单位面积上有160个像素点时),此时作为一个单位比例,即1dp,此时1dp=1px
比如如果用上面的华为手机,则pd设置多少呢?
326.0ppi / (160ppi/pd) = 2.03pd
假设开发时即用单位屏幕的avd开发,则设置为1pd,当放入华为此款手机时,1dp将自动拉升为2.03px
这样的好处:不用改程序了,可以自适应。
dp与px换算公式:
pixs =dips * (densityDpi/160).
dips=(pixs*160)/densityDpi
dp与px转换的方法:
public static int dip2px(Context context, float dipValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dipValue * scale +0.5f);
}
public static int px2dip(Context context, float pxValue){
final float scale = context.getResource().getDisplayMetrics().density;
return (int)(pxValue / scale +0.5f);
}
遗留问题:
上面只是解决了自动拉伸,但有时候,拉伸是有问题的,比如一个按钮4角时圆形而不是方形,如果拉伸就会出现问题:角上的边缘线也拉伸了,其实我只想拉伸内部。
解决方法:9妹。
http://www.eoeandroid.com/thread-79604-1-1.html
http://www.eoeandroid.com/thread-79606-1-1.html
参考:
http://zhidao.baidu.com/question/370403611.html
http://item.jd.com/755374.html
http://blog.sina.com.cn/s/blog_4c0706560100uc4d.html
http://l540151663.iteye.com/blog/1512733(不错!!)
Android多分辨率适配 此篇文章很好!!
http://www.uuton.com/post/3f493_22910a(感谢作者!!)