1.基础概念
屏幕大小:即屏幕对角的的长度。1英寸=2.54厘米,那么一个5寸的手机的对角线长度就是5 X 2.54=12.7厘米。
分辨率:即屏幕的像素点个数,例如:一个屏幕的分辨率为320*480即这个屏幕上有320 X 480个像素点。
dpi:即dot per inch的缩写,就是每英寸的像素数,也叫做屏幕密度。这个值越大,屏幕就越清晰,反之则模糊。例如手机屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度。手机密度的计算公式:手机像素密度(dpi)=(横向or纵向)分辨率 / (横向or纵向)屏幕物理尺寸
dp:也叫dip,即device independent pixels的缩写,就是设备独立像素,也叫逻辑像素。由于Android手机的屏幕有各种大小和不同的分辨率,因此不能直接使用px物理像素为单位,因为直接使用会导致布局在低分辨率的屏幕显示不全,在高分辨率的屏幕上留白。而使用dp这个逻辑像素就会使不同分辨率的屏幕显示的布局尽量一致,从而避免这样的问题出现。所以Android开发使用的逻辑像素单位。
pt:即point,就是一个标准的长度单位,1pt=1/72英寸,ios开发使用的单位
px:即pixels的缩写,就是像素, 1px代表屏幕上一个物理像素点,在不同分辨率的设备上像素点的大小不同,同尺寸的屏幕分辨率越高,像素点越小,反之越大。px像素是Web开发中常用的单位。
sp:即scaled pixels的缩写,就是放大像素。主要用于设置字体的大小。谷歌开发建议文字的大小单位最好使用sp,其目的是当系统设置字体大小时,app的文字能随着系统的设置而放大缩小,但实际开发过程中,如果没有对系统不同大小的字体设计多套布局的话,不建议使用sp,因为当文字随系统设置放大缩小时布局会混乱。例如某个Text布局给了一个30dp的固定高度,内容文字的大小使用sp为单位,当系统设置为最大号的字体时,Text文字大小随之变大会导致文字高度大于Text高度从而显示不全。
2.单位转换
px转为dp
dips=(pixs*160)/densityDpi
private static final float density = mContext.getResources().getDisplayMetrics().density;
/**
* px转成dp
* @param pxValue
*/
public static int px2dip(float pxValue) {
return (int) (pxValue / density + 0.5f);
}
dp转为px
pixs =dips * (densityDpi/160).
private static final float density = mContext.getResources().getDisplayMetrics().density;
/**
* dp转成px
* @param dipValue
*/
public static int dip2px(float dipValue) {
return (int) (dipValue * density + 0.5f);
}
在实际转化的代码中需要加上0.5f是为了在转化为int类型的时候,将计算结果赋值为它最接近的正数。
3.Android如何适配
首先系统会根据不同分辨率的手机选择不同的资源文件,因此需要设计多套UI和多套资源文件。
drawable-ldpi: 低分辨率屏幕密度为120dpi的手机设备(1dp = 0.75px)
drawable-mdpi: 中分辨率屏幕密度为160dpi的手机设备(此为baseline,其他均以此为基准,在此设备上,1dp = 1px)
drawable-hdpi: 高分辨率屏幕密度为240dpi的手机设备 (1dp = 1.5px)
drawable-xhdpi: 更高分辨率屏幕密度为320dpi的手机设备 (1dp = 2px)
drawable-xxhdpi:超高分辨率屏幕密度为480dpi的手机设备 (1dp = 3px)
网友评论