首先屏幕的分辨率和dpi,px没有关系。
因为有 1080x1920的电视屏幕(45英寸), 也有1080x1920的手机屏幕(5.5英寸)
一英寸有多少个点儿? 我们用来density来分辨
ldpi 120dpi 0.75
mdpi 160dpi 1 一般是HVGA
hdpi 240dpi 1.5 一般是WVGA
xhdpi 320dpi 2
xxhdpi 480dpi 3
在160dpi的设备上
DIP(也就是我们用的dip/dp):device independent pixel,设备独立像素, 一英寸的像数数,我们不会直接使用px,而是使用dp,px = 1dp * density(由DPI)决定。
在mdpi设备上 1dip = 1px
在xxhdpi设备上 1dip = 3px
尽量使用widget的宽高尽量使用dp,字体使用sp,让系统自己按照比例适配。
参考文章中还提到了在一些非常规的设备上 如何适配尺寸和大小。
总的来说,如果是图片 可以先按照最大的设备进行切图,widget的宽高设置成wrap_content即可,其余小图的尺寸可以按照上面的比列进行切图。
对于一些必须定义出的宽高,则使用
values-mdpi/dimens.xml
values-hdpi/dimens.xml
values-xhdpi/dimens.xml
values-xxhdpi/dimens.xml
values/dimens.xml
来适配不同的大小。
不同分辨率的布局:
layout-640x360,layout-800x480
手机上px和dp,sp之间的转化
private static final float scale = mContext.getResources().getDisplayMetrics().density;
private static final float scaledDensity = mContext.mContext.getResources().getDisplayMetrics().scaledDensity;
/**
- dp转成px
- @param dipValue
- @return
*/
public static int dip2px(float dipValue) {
return (int) (dipValue * scale + 0.5f);
}
/**
- px转成dp
- @param pxValue
- @return
*/
public static int px2dip(float pxValue) {
return (int) (pxValue / scale + 0.5f);
}
/**
- sp转成px
- @param spValue
- @param type
- @return
*/
public static float sp2px(float spValue, int type) {
switch (type) {
case CHINESE:return spValue * scaledDensity;
case NUMBER_OR_CHARACTER:
return spValue * scaledDensity * 10.0f / 18.0f;
default:
return spValue * scaledDensity;
}
}
参考
http://www.paibaidu.com/index.php/2014/08/13/966.html