关于px与dp的一些资料:
dp 与 px 的关系:
现在大家通用的算法:
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);
}
然而根据上面的资料可以得到这样的公式:
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值表示每英寸有多少个显示点
现在大家通用的算法:
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);
}
两种方法都能达到同样的效果。。但是我感觉第二种方法更容易理解。。
用代码体现就是:
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);
}
两种方法都能达到同样的效果。。但是我感觉第二种方法更容易理解。。