px:像素
dp:基于 density的抽象单位
dip:像素密度
sp:
px = dp * density;
density = dpi / 160;
px = dp *dpi /160;
文件夹名称 | 分辨率 | dpi | density |
ldpi | 120dpi | 0.75 | |
---|---|---|---|
mdpi | 160dpi | 1 | |
hdpi | 480*800 | 240dpi | 1.5 |
xhdpi | 720*1280 | 320dpi | 2 |
xxhdpi | 1080*1920 | 480dpi | 3 |
xxxhdpi | 1440*2560 | 640dpi | 4 |
所以如果只有一套切题的话,可以让美工根据1080*1920的比例给一套切图,这样根据公式px = dp/density 可以得到dp值是px的3分之1
举例说明:
美工根据1080*1920比例给出一个宽3px的textView;那么宽度值为1dp;TextView占频幕宽度3/1080 = 1/360;
当屏幕切换为720*1280时 ,density值变为2,那么1dp的宽度即为2px,所以TextView占频幕宽度2/720 = 1/360;
所以当两种不同分辨率手机都设置为1dp时,TextView所占屏幕比例是一直的;
常见的工具类中会有px和dp的转换方法:
[java] view plain copy print?
import android.content.Context;
public class DensityUtil {
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
之所以会加上0.5是因为:
px为1时,如果通过px/density直接得到的是0,
px为2时,如果通过px/density直接得到的也是0,
加上0.5主要就是为了四舍五入,即
px为1时,如果通过px/density直接得到的是0,
px为1时,如果通过px/density直接得到的是1;