dpi dip 分辨率 屏幕尺寸 px density 关系及换算

时间:2024-03-02 10:10:23

iphone7 宽2.3 密度是326一英寸   当有一个400px*400px的正方形 由于一英寸等于326  不够放,所以要用2英寸放  假设密度是400dpi那就占用的空间大小是一样的

所以光看屏幕的分辨率对于设计师不具备多少实际意义,通过分辨率计算得出的像素密度ppi才是设计师要关心的问题。

再次使用iphone6~7作为例子,我们知道该屏幕的横向物理尺寸是2.3英寸,且横向具有750颗像素,根据下面的公式,我们能够计算出iphone6~7的屏幕是326ppi 意为每英寸存在326颗像素,其实无论我们怎么除,计算得出来得像素密度(ppi)都会是这个数,宽存在像素除以宽物理长度,高存在像素除以高物理长度,得数都接近于326,

对设计会造成什么样的影响

一快326*326px的正方形色块在一台iphone7上面展现出来的物理尺寸将会是1*1英寸,这是因为该屏幕每英寸能容纳326颗像素,所以326px凑在一起就是1英寸,假设我们能竟iphone7手机屏幕ppi调低50%变为163,色块还是326*326px。这个色块的物理尺寸会变为2*2英寸,同样多的像素看起来却大了一倍

dip设置与分辨率无关,但写屏幕密度有关在默认情况下

LDPI密度为120,系数为0.75

MDPI密度为160,系数为1.0

HDPI的密度为240,系数为1.5

XHDPI的密度为320,系数为2.0

 


• dip :Density independent pixels  设备无关像素

• dp:就是dip

• px :像素

• dpi :dots per inch 直接来说就是一英寸多少个像素点  常见取值120 160 240 我们一般称作像素密度  简称密度

• density :直接翻译的话叫密度 常见取值 1.5 ,1.0和标准dpi的比例(160px/inc) 

• 分辨率 : 横纵两个方向的像素点的数量 常见取值480*480 320*480

• 屏幕尺寸 : 屏幕对角线的长度 电脑电视同理

• 屏幕比例的问题 : 因为只确定了对角线的长度 两边长度还不一定 所以有了4:3 ,16:9这种 这样就可以算出屏幕边长了


 

在android里面,获取一个窗口的metrics,里面有这么几个值

 metrics.density; 
 metrics.densityDpi;

  densityDpi : 就是我们常说的dpi

  density : 其实是dpi/(160像素/英寸)后得到的值

  DPI本身也是带单位的(像素/英寸)

  density是一个比例值

 


各单位间转换

  计算dpi

    比如一个机器,屏幕是4寸,分辨率是480*800,因为不知道边长,肯定不能分开算,4是对角线的长度,那直接用勾股定理算对角线的像素。除以4,算出来大概是dpi=233像素/英寸,那么denstity就是(233px/inch)/(160px/inch)=1.46左右。顺带说下,android默认的只有3个dpi,low,medium和high对应120,160,240,如果没有特别的设置,所有的dpi都会被算成这三个,其中默认就是160

  为什么标准的dpi=160

  (1)Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi

    实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 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

     (2)这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。


 

1. 屏幕尺寸(screen size)

 

  就是我们平常讲的手机屏幕大小,是屏幕的对角线长度,一般讲的大小单位都是英寸。
  比如iPhone5S的屏幕尺寸是4英寸。Samsung Note3是5.7英寸。

 

  

 

2.像素(pixel)

  想像把屏幕放大再放大,对!看到的那一个个小点或者小方块就是像素了。

图 2

3.分辨率(Resolution)

  是指屏幕上垂直方向和水平方向上的像素个数。
  比如iPhone5S的分辨率是1136*640;Samsung Note3的分辨率是1920*1080;

图 3 

4.dpi

  是dot per inch的缩写,就是每英寸的像素数,也叫做屏幕密度。这个值越大,屏幕就越清晰。
  iPhone5S的dpi是326; Samsung Note3 的dpi是386

图 4

5.dip

  是Density independent pixel的缩写,指的是抽象意义上的像素。跟设备的屏幕密度有关系。

  它是Android里的一个单位,dip和dp是一样的。

Google的官方说明是这样的:
  

密度独立像素(dp)

在定义UI布局时,应该使用一个虚拟像素单元,以一种密度独立的方式表示布局维度或位置。

密度无关的像素相当于一个物理像素在160 dpi屏幕上,这是系统为“中等”密度屏幕所假设的基线密度。在运行时,系统会根据实际的屏幕密度,透明地处理dp单元的任何扩展。将dp单元转换为屏幕像素很简单:px=dp(dpi/160)。例如,在240 dpi屏幕上,1 dp等于1。5物理像素。在定义应用程序的UI时,应该始终使用dp单元,以确保在具有不同密度的屏幕上正确显示UI。

  就是说在160dpi的屏幕上,1dip=1px。
  它跟屏幕密度有关,如果屏幕密度大,1dip代表的px就多,比如在320dpi的屏幕上,1dip=2px。

为什么我们在布局的时候最好要用dip,不要用px?

   是因为这个世界上存在着很多不同屏幕密度的手机,屏幕密度是什么?就是dpi,就是单位长度里的像素数量。

  想象一下,如果这些手机的尺寸一样,屏幕密度相差很大,那么是不是说一个手机水平方向上像素很少,另一个手机水平方向上像素很多?那我们画同样pix数量的时候,它显

  示的长度不就会不一样了?

  比如下面图中的两个手机,同时设置2px长度的Button,在屏幕密度较高的手机里就会显示的比较小。

  而同时设置的2dip长度的Button,在两个手机上显示的大小是一样的。

 

图 5

  所以如果你在App布局中都用的px作为单位,那么你的App跑在各个设备上就会出现奇奇怪怪的现象了。 

  来看一下emulator上的效果,我定义了两个Button,分别用px和dip做单位。

  布局文件里这样写

复制代码
复制代码
<Button android:layout_width="100px"
    android:layout_height="100px"
    android:text="@string/str_button1"/>
 
    <Button android:layout_width="100dip"
    android:layout_height="100dip" 
    android:text="@string/str_button1"/>
复制代码
复制代码

显示的界面是这样的:

  

图 6 

  getResources().getDisplayMetrics().densityDpi 就是屏幕密度。
  getResources().getDisplayMetrics().density 也可以理解为1dip相当于多少个px啦。
  上面的dpi是240,1dip=1.5px
  你看,100dip的Button是100pxButton的1.5倍长吧。