美文网首页
辨析Android中的dp、px之间的关系及一些概念

辨析Android中的dp、px之间的关系及一些概念

作者: 已迁至知乎_此不再维护 | 来源:发表于2016-10-13 11:33 被阅读0次

    手机的尺寸: 屏幕对角线的长度,单位为英寸(2.54cm)

    手机的分辨率: 屏幕能显示的像素的数量, 一般用在长方向上数量*宽方向上数量来表达

    手机的像素密度: pixels per inch,也称PPi,即每英寸屏幕能显示的像素数,像素密度越大,显示画面细节就越丰富。�计算:像素密度={1+√[(长度像素数-1)2+(宽度像素数-1)2]}/屏幕尺寸

    DPI: Dots Per Inch(每英寸所打印的点数或线数)的缩写,用来表示打印机打印分辨率, 但有时也会用dpi来代指ppi

    手机的密度: Density, 以160dpi为基准,手机的像素密度与基准的比值。 即像素密度为160时Density为1

    常用dpi标识(字母) 常用dpi标识(数字) 手机密度(density)
    ldpi 120dpi 0.75
    mdpi 160dpi 1.0
    hdpi 240dpi 1.5
    xhdpi 320dpi 2.0

    px: pixels(像素) ,1px就是屏幕上一个物理像素点的大小(长度)。

    dp/dip: device-independent pixels(设备无关像素),一个基于density的抽象单位,如果一个160dpi的屏幕(手机密度为1的话),1dp=1px

    定义:1dp = (dpi / 160) px
    也就是1px = 1/density dp
    即:1dp = density px

    • 160dpi:1dp = 1px
    • 120dpi:1dp = 0.75px
    • 320dpi:1dp = 2px

    dp值转换为px值得方法为:
    假设手机密度 :density = x,dp的值为y
    由1dp = density px
    可知ydp = yx px
    所以结果为y
    x

    px值转换为dp值得方法为:
    假设手机密度 :density = x,px的值为y
    由1px = 1/density dp
    可知 ypx = y/x dp
    所以结果为y/x

    因此有了如下方法:
    public static int dip2px(Context context, float dipValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(dipValue * scale + 0.5f); } public static int px2dip(Context context, float pxValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(pxValue / scale + 0.5f); }

    至于为什么要加0.5f?
    因为在java中,强制转换符把float转换为int时,是直接丢掉小数部分的,加0.5f起到了四舍五入的作用,可以减小误差。

    相关文章

      网友评论

          本文标题:辨析Android中的dp、px之间的关系及一些概念

          本文链接:https://www.haomeiwen.com/subject/flswyttx.html