屏幕尺寸,像素,分辨率,dpi,dp,density详解
2015-07-28 23:57
615 查看
在Android中,有一些概念你肯定听过,但是对它一知半解,就比如我们标题上提到的几个名词,在Android开发中肯定接触过,但是并不完全知道是什么含义,今天我们就详细的说一说这几个名字的概念,以及其中的关系。
首先我们来说一说这些名词的基本概念:
屏幕尺寸:屏幕对角线长度。像电脑,电视都是这么算的。比如说手机5寸屏,就是说手机屏幕的对角线长度是5寸。
像素:pixel,构成图片的一个个的小方点,这个点就是像素。
分辨率:一个屏幕上横向像素点数乘以纵向像素点数。例如1280x720,就是纵向有1280个像素点,横向有720个像素点。
dpi:dots per inch,每英寸有多少个像素点。Android中常见的是120,160,240,320。这个值可以称为像素密度。
dp:divices independent pixels,设备无关像素。算出来的值,后面细说。
density:直译为密度,是手机dpi和标准dpi的比例。标准dpi为160(pixels/英寸)。
概念说到这里,相信大家已经明白了在开发中的一些问题,比如,如果手机屏幕很小,但是分辨率很高,就是说要在一个很小的地方上放很多像素点,那么带来的效果就是每英寸里的像素点很多,就是dpi很高,那么图像就会很清晰细腻。反之,如果屏幕很大,但是分辨率很低,就是说要在一个很大的地方上放很少的像素点,那么带来的效果是每英寸里像素点很少,dpi就很低,那么图像就会很模糊。
通过上面的概念,我们可以得出以下公式:
dpi = 对角线的像素点数(分辨率利用勾股定理算一下) / 屏幕尺寸
density = dpi / 标准dpi(160(pixels / 英寸))
dp = 像素点数 x density
看了上面的公式,就可以知道为什么Android里建议在布局的时候用dp而不用像素(px),因为dpi是一个变化的值,从而导致density是一个变化的值,布局中设置控件宽高的本意是这个控件在屏幕上看起来要多宽多高,但是由于这些变化的值,会导致实际效果会有偏差。
下面再说说为啥dpi标准值是160(pixels / 英寸):
Android开发中主流的dpi有四个档次:120dpi,160dpi,240dpi,320dpi。实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75 来给界面中的元素来进行尺寸定义。也就是说如果以 160 dpi 作为基准的话,只要尺寸的 dp 是 4 的公倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI
下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。但假设以 240 dpi 作为标准,那需要 DP 是 3 的公倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi。并且第一款Android设备是属于160dpi的。
在Android开发中,我们怎么能拿到这些值呢,答案是在DisplayMetrics类里,这里面会有很多属性值,代码如下:
首先我们来说一说这些名词的基本概念:
屏幕尺寸:屏幕对角线长度。像电脑,电视都是这么算的。比如说手机5寸屏,就是说手机屏幕的对角线长度是5寸。
像素:pixel,构成图片的一个个的小方点,这个点就是像素。
分辨率:一个屏幕上横向像素点数乘以纵向像素点数。例如1280x720,就是纵向有1280个像素点,横向有720个像素点。
dpi:dots per inch,每英寸有多少个像素点。Android中常见的是120,160,240,320。这个值可以称为像素密度。
dp:divices independent pixels,设备无关像素。算出来的值,后面细说。
density:直译为密度,是手机dpi和标准dpi的比例。标准dpi为160(pixels/英寸)。
概念说到这里,相信大家已经明白了在开发中的一些问题,比如,如果手机屏幕很小,但是分辨率很高,就是说要在一个很小的地方上放很多像素点,那么带来的效果就是每英寸里的像素点很多,就是dpi很高,那么图像就会很清晰细腻。反之,如果屏幕很大,但是分辨率很低,就是说要在一个很大的地方上放很少的像素点,那么带来的效果是每英寸里像素点很少,dpi就很低,那么图像就会很模糊。
通过上面的概念,我们可以得出以下公式:
dpi = 对角线的像素点数(分辨率利用勾股定理算一下) / 屏幕尺寸
density = dpi / 标准dpi(160(pixels / 英寸))
dp = 像素点数 x density
看了上面的公式,就可以知道为什么Android里建议在布局的时候用dp而不用像素(px),因为dpi是一个变化的值,从而导致density是一个变化的值,布局中设置控件宽高的本意是这个控件在屏幕上看起来要多宽多高,但是由于这些变化的值,会导致实际效果会有偏差。
下面再说说为啥dpi标准值是160(pixels / 英寸):
Android开发中主流的dpi有四个档次:120dpi,160dpi,240dpi,320dpi。实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75 来给界面中的元素来进行尺寸定义。也就是说如果以 160 dpi 作为基准的话,只要尺寸的 dp 是 4 的公倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI
下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。但假设以 240 dpi 作为标准,那需要 DP 是 3 的公倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi。并且第一款Android设备是属于160dpi的。
在Android开发中,我们怎么能拿到这些值呢,答案是在DisplayMetrics类里,这里面会有很多属性值,代码如下:
public static void printDevicesProperties(Context context) { if (context != null) { if (context.getResources() != null) { if (context.getResources().getDisplayMetrics() != null) { DisplayMetrics dm = context.getResources() .getDisplayMetrics(); int screenWidth = dm.widthPixels; int screenHeight = dm.heightPixels; int dpi = dm.densityDpi; float density = dm.density; } } } }
相关文章推荐
- linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法
- 【转】能否用讲个故事的方式,由浅入深,通俗易懂地解释一下什么是天使投资,VC,PE.
- 盘点安卓手机被吐槽最多的三大奇葩设计
- 【算法学习笔记】86.栈 中缀表达式 SJTU OJ 1033 表达式计算
- hdu 4450 Draw Something(水)
- 两个表指定条件的笛卡尔连接
- 生命,因为热爱所以敬畏
- I - Pots -BFS
- E - Children of the Candy Corn -DFS模拟+bfs
- 数组-指针
- POJ2425 A Chess Game(博弈)
- iOS 开发一些小技巧(收集整理)
- HDOJ 5323 Solve this interesting problem BFS搜索
- CSU1660(深搜)
- 15.07.28
- HDU 3501 Calculation 2(欧拉函数)
- 初识JavaScript
- Speedup,Scaleup,Sizeup
- Android获取图片资源的4种方式
- DDSM数据库转换图像格式——LJPEG转为PNG格式