dp==dip:设备独立像素 。(device independent pixels)
dip是年迈的dp,已经退休,在比较老的代码中还可以看到dip。目前谷歌推荐用dp,在我们开发安卓程序的时候,除了字体之外,都推(强)荐(制)使用dp。
sp:比例像素。(scaled pixels )
sp一般用于处理字体、安卓有个东西叫做大字体,那玩意就是专门调整sp的。所以所有关于字体的单位,推(强)荐(制)使用sp。
px:像素(pixels)
px即手机上面的物理点,属于物理范畴的,所以在写安卓程序的时候不建议使用。
安卓手机凭密度分为 :低密度(120dpi)、中密度(160dpi)、高密度(240dpi)、超高密度(320dpi)、超超高密度(480dpi)
按照谷歌的编码规范对应:ldpi 、mdpi 、hdpi 、xhdpi 、xxhdpi
此处不考虑屏幕的尺寸,因为同一密度的手机,尺寸可能相差较多,这时你会要求图依据手机尺寸进行不同程度的缩放和拉伸以适应屏幕的大小。这也正是我们推(强)荐(制)使用dp的原因,dp会根据手机的密度对尺寸进行适配,这保证了同一密度的手机,只需要一组图即可。
计算手机的密度: 密度 = √(长²+宽²)/对角线长度 其中对角线长度用英寸 算下来的如果等于164 就约等于160
在160dpi下,即mdpi中,1dp == 1px ==1sp;(一般dp不与sp进行比较,仅在160dpi下其相等)
在320dpi下,即xhpdi中,1dp == 2px
在480dpi下,即xxhpdi中,1dp == 3px
我们可以知道 1dp = (当前dpi/160dpi)px。
现实中,一般作为开发人员,可以找UX或者UI要图的时候就需要计算一下几乘几,否则很容易造成误解。
然而代码中,可以使用如下代码进行dp px的转换,同时也提供px和sp的转换(注意不是sp和dp,因为无意义)。
[java] view plaincopy
import android.content.Context;
/** * dp、sp 转换为 px 的工具类 * * @author fxsky 2012.11.12 * */ public class DisplayUtil { /** * 将px值转换为dip或dp值,保证尺寸大小不变 * * @param pxValue * @param scale * (DisplayMetrics类中属性density) * @return */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * 将dip或dp值转换为px值,保证尺寸大小不变 * * @param dipValue * @param scale * (DisplayMetrics类中属性density) * @return */ public static int dip2px(Context context, float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } /** * 将px值转换为sp值,保证文字大小不变 * * @param pxValue * @param fontScale * (DisplayMetrics类中属性scaledDensity) * @return */ public static int px2sp(Context context, float pxValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } /** * 将sp值转换为px值,保证文字大小不变 * * @param spValue * @param fontScale * (DisplayMetrics类中属性scaledDensity) * @return */ public static int sp2px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } }