dp与px转换

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

  • 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);
}

两种方法都能达到同样的效果。。但是我感觉第二种方法更容易理解。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值