Android中的像素单位px、dp、sp的区别

使用规律,务必牢记:文字的尺寸一律用sp单位,非文字的尺寸一律使用dp单位,代码才用px。

首先,我们先弄明白px这个单位的含义,因为px是dp、sp的基础,其实dp、sp是为了解决屏幕适配的问题,在px单位基础之上进行计算所得到的单位。
px其实就是计算机语言中的像素,我们知道一张精美的图片是由许许多多的像素点组成的。每个像素点代表一种颜色,这些像素点组合成了一张精美的图片。在手机屏幕上,屏幕的显示也是由一个个像素点组成的,然而为什么我们不直接用像素作为安卓应用的单位呢?

现在我们来看一个需求

假如我现在有两部屏幕大小相同的手机,但是两部手机的分辨率不同,也就是同样大小的屏幕上显示的像素数量是不同的,假设A手机为宽×高为160×320像素,而B手机为宽×高为320×640像素,即B手机显示的像素数量是A手机的四倍。现在我需要编写一款APP能在A、B手机中展示同一张图片,这张图片的大小为像素160×320,而且要求这张图片都占满屏幕,该怎么做?
首先,我们能够很直观的发现,这里不能使用px作为展示图片控件的单位了,如果将此控件的宽高设置为图片的大小,那岂不是该图片虽然在A手机上占满屏幕而在B手机上只占满了四分之一屏。换另外一种说法就是,我以A手机的像素大小来做了一个页面以后,运行到一个同样大小然而分辨率不同的手机上,这个页面就不能很好地展示了;如果要运行到一个屏幕尺寸也不同,分辨率也不同的手机上,情况岂不是更糟糕,然而这并不是我们想要的。
所以我们需要一个新的单位来解决这种问题,这个单位能够兼顾到手机屏幕尺寸与手机像素,通过一个比例来将这个图片扩大四倍来使得这张图片占满B手机的屏幕。往大了来说,我希望我使用的单位并不是一个绝对值,而是一个相对值,这个值可以根据我的APP运行的手机屏幕尺寸和分辨率的不同,来做很好地适配,从而使得我的APP一次编写能够很好地运行在各种不同的手机上。
所以,dp、sp也就应运而生了,它们的存在就是为了解决这个问题。

何为dp、sp?

其实我们并不用去纠结了,只要知道这是在像素和屏幕尺寸的一种比例产物即可,用来解决的问题上面也已经说的很是清楚。
我还要解释一下另外一个问题,为什么要用sp来表示文字大小呢?那是因为android手机在系统设置里面可以设置字体的大小(小、普通、大、超大),设置普通字体时,同数值dp和sp的文字看起来是一样大的,但如果设置为大字体,用dp设置大小的文字没有变化,而用sp设置大小的文字就变大了。所以说,dp与系统设置的字体大小没有关系,而sp会随系统设置的字体大小来变大或者变小。

难道px就一点都不需要重视吗?

答案是:非也。以上使用仅限于XML布局文件中的使用,在代码中设置控件的大小其实使用的单位都是px,那么这也就涉及到了px与dp之间的转换问题。

dp与px之间的关系

dp和px之间的换算,取决于具体设备上的像素密度,即每单位屏幕中显示的像素数量,像素密度是DisplayMetrics里的density参数。density=px值/dp值,即当density=1.0时,表示一个dp值对应一个px值;具体的转换函数如下所示:

    /**  
     *  以下两个方法展示了dp与px之间的互相转换。所用公式就是density=px值/dp值。
     *  注意的是,需要通过上下文的相关方法获取到density的值进行计算。
     *  计算值后面都加了0.5f是为了防止舍入  误差,浮点数进行int强转进行的是四舍五入的操作,0.5f保证值一定进1.
     */
    /**  
     * 根据手机屏幕的密度从dp的单位转成为px。 
     */    
    public static int dp2px(Context context, float dpValue) {  
        final float density= context.getResources().getDisplayMetrics().density;  
        return (int) (dpValue * density+ 0.5f);  
    }  

    /**  
     * 根据手机屏幕的密度从px的单位转成为dp。 
     */    
    public static int px2dp(Context context, float pxValue) {  
        final float density= context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / density+ 0.5f);  
    }  

使用场景

由于只有在代码中才会使用到px的值,所以代码中进行的运算就是dp转px的运算,使用案例如下:

    /*
     * 上述两个方法置于Utils包内,一般用于解决特定问题的方法都会置于相关的Utils方法中
     */
    int px = Utils.dp2px(this, 10.0f);  
    LinearLayout.LayoutParams textViewParams = new LinearLayout.LayoutParams(  
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);  
    textViewParams.setMargins(px, px, px, px);  
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值