Android中px和dip的区别

在Android手机的诞生之初,由于Android系统是开源的,一开始便有众多的OEM厂商对Android手机进行深度定制,于是乎Android手机的皮肤和屏幕大小都变得百花齐放,这可苦逼了我们这群开发者,因为我们被要求要注意写出一个好的Android软件,写一次代码就能适应大小不同的屏幕。这就好比,你做了一套衣服,要让不同身材的人都穿得合身,类似于生活中的道理,我们这套衣服肯定不能用没有弹性的布料,所以我们要像生活中那种无尺码,有弹性的衣服学习,在代码里面尽量让界面能够自动适应屏幕的大小,幸好Android操作系统提供了一些这方面的屏幕适应机制。

       屏幕上的图案最终就是由一个个的点构成的,也就是说我们最终要控制的就是怎么合理地拉伸屏幕上的点,以便让界面合理地铺到界面上,好像专门为了用户手中的这块屏幕开发的一样,android中的界面显示单位主要有px,dp(dip),sp等,下面我们将简单地介绍它们并提出在什么场合使用。

几乎是一条定律:

除了sp和dp,不要使用别的单位,除非你没有办法不那么做。使用sp/dp会让你的Android应用适应多种密度和分辨率。--Daniel Lew

 

关于Android中如何适应不同的屏幕大小及分辨率,看了一些文章,其中比较经典的一个stackoverflow上的讨论《Android手机上px,dp,dip和sp的区别》,下面让我们看看dp和px的区别

先直观地看看dp和px的显示效果。

图1.设置相同的px,界面元素在不同的屏幕密度下的表现

    从图1中,我们可以看出,当屏幕的尺寸(用英寸来表示)相同时,在不同屏幕密度(density)下,用等大的像素来表示的时候,在低屏幕密度的屏幕上显示得比较大(如上图中的左侧图片),在高屏幕密度的屏幕上显示得比较小(如上图中的右侧图片)。

图2.设置相同的dip,界面元素在不同的屏幕密度下的表现

     从图2中,可以看出,在屏幕的尺寸相同时,而屏幕的密度不同是,界面元素在铺在界面上的比例相同。这是因为图2中界面元素的显示单位用的是dip,它能够根据屏幕密度自动调整界面元素的大小,让界面元素以恰当的比例显示在屏幕上。

注意:当两块屏幕的长和宽可以用相同的dip来表示的话,那么界面元素能够按照屏幕密度自动拉伸到恰当的大小,但是如果两块屏幕的长宽不能用相同的dip元素来表示的话,那么界面虽然会根据屏幕密度拉伸,但是拉伸的比例也不会正确。因为根据dip、屏幕密度进行拉伸的原理,其实是长或宽的dip数乘以屏幕密度进而得到正确的像素(pixels),因为最终要显示到屏幕上的时候,必须要将界面显示的单位落实到像素(pixels)上,只是Android系统自动帮我们完成了这个转换的工作。

dp(dip)是什么

dp(或dip)的全称是Density-independent Pixels(密度独立像素) 。dp是一个抽象单位,建立在屏幕的物理密度上。这些单位都是相对于一个160 dpi(dots per inch 每英寸拥有的点数)屏幕,上面1 dp几乎等于1 px。当运行在更高密度的屏幕上,原先描绘1dp的像素需要根据一个合适的比例扩大到一定的数量,以便适合屏幕的dpi。同样,当在一个低密度屏幕,用来显示1dp的像素需要按比例缩小一定的数量。dp转化成pixe的比率会随着屏幕的密度改变,但不一定成正比。使用dp单位(而不是px)是一个简单的解决方案,使得在你的布局(LayOut)中界面元素的大小,能根据不同的屏幕密度调整到适当的大小。换句话说,它提供了在不同的设备中,UI元素实际大小的一致性。

px是什么

Pixels(像素)——对应于实际的像素在屏幕上。这个单位是不建议使用的,因为界面可能需要显示在多个设备中,每个设备可能有不同屏幕密度和屏幕上所有像素的数量可能更多或者更少。

什么时候用dip

当屏幕的长宽用dip表示时,长宽都是相同的话,那么就可以使用dip进行界面元素的大小的布局,Android会自动帮我们拉伸到合适的尺寸,但是,如果屏幕差异太大的话,那么用dip进行布局大小的限定还是会出现问题的。

 

示例代码

参考链接

Supporting Multiple Screens

Android实用代码七段(一)

Android屏幕密度(Density)和分辨率的关系

Android Density(密度)

Dimension

Difference between px, dp, dip and sp in Android?

作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/p/3307020.html

时间: 2024-10-25 15:09:50

Android中px和dip的区别的相关文章

Android中px与dip,sp与dip等的转换工具类

原文:http://www.cnblogs.com/wader2011/archive/2011/11/28/2266684.html 功能 通常在代码中设置组件或文字大小只能用px,通过这个工具类我们可以把dip(dp)或sp为单位的值转换为以px为单位的值而保证大小不变.方法中的参数请参考http://www.cnblogs.com/wader2011/archive/2011/11/28/2266669.html 代码 /**  * Android大小单位转换工具类  *   * @aut

android中px,dp,dip和sp有什么不同?

问题描述 android中px,dp,dip和sp有什么不同? android中px,dp,dip和sp有什么不同?有人能详细的说一下吗? 解决方案 http://www.cnblogs.com/fbsk/archive/2011/10/17/2215539.html 解决方案二: 解决方案三: px是像素.显示的基础都是以像素来计算的. ppi 是屏幕密度,分辨率/屏幕尺寸就是ppi.比如480__*800就是分辨率,屏幕尺寸单位为英寸.取的值为屏幕的对角线. dp也就是dip是google定

Android中asset和raw的区别详解_Android

*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到 R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 *读取文件资源

Android中invalidate()和postInvalidate() 的区别及使用方法_Android

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用.       Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调

Android中asset和raw的区别详解

*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到 R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 *读取文件资源

Android中invalidate()和postInvalidate() 的区别及使用方法

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调用inval

Android 中SP与DP的区别实例详解_Android

从一开始写Android程序,就被告知这些常识 1.长度宽度的数值要使用dp作为单位放入dimens.xml文件中 2.字体大小的数值要使用sp作为单位,也放入dimens.xml文件中 然后,就没有然后了,仿佛潜台词就是说,你记住去用就行了. 偶然有一天,当我们阴差阳错地将字体写成了dp,也是可以工作,而且效果和sp一样. 这时候,就开始怀疑了,到底有啥区别呢,dp和sp有什么不同呢? 我们做个简单的Sample验证一下,如下,一个布局代码 <TextView android:layout_w

Android对px和dip进行尺寸转换的方法

px  转换为 dip /** * PX 转换为 DP * * @param context * @param px * @return */ public static int px2dp(Context context, int px) { float scale = context.getResources().getDisplayMetrics().density; return (int) (px / scale + 0.5f); } dip 转换为 px /** * DP 转换为 P

简单谈谈Android中SP与DP的区别_Android

从一开始写Android程序,就被告知这些常识 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px.不同设备有不同的显示效果,这个和设备硬件有关. 二.sp(Scaled Pixels) 主要用于字体显示,与刻度无关的一种像素,与dp类似,但是可以根据用户的字体大小首选项进行缩放. 简单的说 长度宽度的数值要使用dp作为单位放入dimens.xml文件中 字体大小的数值要使用sp作为单位,也放入dim