Android中的像素单位px、dp、sp的区别
2017-07-24 22:44
169 查看
使用规律,务必牢记:文字的尺寸一律用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值;具体的转换函数如下所示:
使用场景
由于只有在代码中才会使用到px的值,所以代码中进行的运算就是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);
相关文章推荐
- 【Android笔记】像素单位px、dp、sp的区别与理解
- Android像素单位dp、sp、px、pt的区别和比较
- Android中度量单位px、dip、dp、sp、pt的区别 像素及屏幕密度决定显示效果的美观
- Android的px、dp和sp等单位的区别详解
- [Android问答] px、dp和sp,这些单位有什么区别?
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- Android的px,dp和sp等单位的区别
- [Android问答] px、dp和sp,这些单位有什么区别?
- Android开发(十)——像素单位dp、px、pt、sp的比较
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android中计量单位DIP DP SP PX PT的区别
- 简述Android单位dp、sp、dip、px、等的区别和使用
- 【Android学习】android布局中几个距离单位的区别:px、dp、sp
- 比较android中的像素单位dp、px、pt、sp
- Android中px、dp、sp,这些单位的区别
- Android的px、dp和sp等单位的区别详解
- [Android问答] px、dp和sp,这些单位有什么区别?
- 【转】Android根据分辨率进行单位转换-(dp,sp转像素px)
- [Android问答] px、dp和sp,这些单位有什么区别?
- Android长度单位px,in,mm,pt,dp,dip,sp换算公式以及区别