dp与px转换

关于px与dp的一些资料:
dppx的关系:

    QVGA: density=0.75 densityDpi=120 QVGA240*320
    HVGAdensity=1.0 densityDpi=160 HVGA320*480
    VGAdensity=1.0 densityDpi=160 VGA480*640
    WVGA:density = 1.5 densityDpi=240 WVGA(480*800)
    WQVGAdensity=2.0 densityDpi=120 WQVGA240*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);
}

两种方法都能达到同样的效果。。但是我感觉第二种方法更容易理解。。
posted @ 2013-01-15 17:01  tanqiantot  阅读(233)  评论(0编辑  收藏  举报