关于px与dp的一些资料:
dp
与
px
的关系:
QVGA:
density=0.75 densityDpi=120 QVGA(
240*320)
HVGA:
density=1.0 densityDpi=160 HVGA(
320*480)
VGA:
density=1.0 densityDpi=160 VGA(
480*640)
WVGA:density = 1.5 densityDpi=240 WVGA(480*800)
WQVGA:
density=2.0 densityDpi=120 WQVGA(
240*400)
densityDip值表示每英寸有多少个显示点
而当
densityDip=160时,1dp=1px。
现在大家通用的算法:
public static int dip2px(Context context,float dipValue){
final float scale=context.getResouses().getDisplayMetrics().density;
return (int)(dipValue*scale+0.5f);
}
public static int px2dp(Context context,float pxValue){
final float scale = context.getResource.getDisplayMetrics().density;
return (int)(pxValue/scale+0.5f);
}
然而根据上面的资料可以得到这样的公式:
px = dp*(
densityDpi/160)
dp = (
px*160)
/densityDpi
用代码体现就是:
public static int dip2px(Context context,float dipValue){
final float scale=context.getResouses().getDisplayMetrics().densityDip;
return (int)(dipValue*(scale/160));
}
public static int px2dp(Context context,float pxValue){
final float scale = context.getResource.getDisplayMetrics().densityDip;
return (int)((pxValue*160)/scale);
}
然而当
1dp,densityDpi=120时,用上面那个转换方法得到的会是0px,然而如果要用小华华给的方法会是1px。
1px ,densityDpi=240时,用上面那个转换方法得到的也是0dp,用小华华给的方法仍然会为1dp。
所以上面的方法该修改,当小数位不小于0.5的时候进位。所以上面方法修改为:
public static int dip2px(Context context,float dipValue){
final float scale=context.getResouses().getDisplayMetrics().densityDip;
return (int)(dipValue*(scale/160)+0.5f);
}
public static int px2dp(Context context,float pxValue){
final float scale = context.getResource.getDisplayMetrics().densityDip;
return (int)((pxValue*160)/scale+0.5f);
}
两种方法都能达到同样的效果。。但是我感觉第二种方法更容易理解。。