Android开发中dp、dpi、px的区别(转)

一、基本概念

- dp:安卓中的相对大小

- dpi:(dot per inch)每英寸像素多少

- px:像素点

二、详细说明

1、px和dpi

- px:

平常所说的1920×1080只是像素数量,也就是1920px×1080px,代表手机高度上有1920个像素点,宽度上有1080个像素点。

- dpi:

要想判别手机屏幕的显示好坏,还要考虑屏幕的宽高(英寸),也就是用dpi即每英寸多少像素来评价屏幕的显示效果。(不然假如手机分辨率是1920×1080,但是屏幕是几十寸的,那显示效果将不会很好,甚至你有可能看到小的像素块,那将更影响视觉效果。)

2、dp

(1)、怎样理解dp才好呢?

  • 其实dp就是为了使得开发者设置的长度能够根据不同屏幕(分辨率/尺寸也就是dpi)获得不同的像素(px)数量。比如:我将一个控件设置长度为1dp,那么在160dpi上该控件长度为1px,在240dpi的屏幕上该控件的长度为1*240/160=1.5个像素点。
  • 也就是dp会随着不同屏幕而改变控件长度的像素数量。
  • 关于dp的官方叙述为当屏幕每英寸有160个像素时(也就是160dpi),dp与px等价的。那如果每英寸240个像素呢?1dp—>1*240/160=1.5px,即1dp与1.5px等价了。
  • 其实记住一点,dp最终都要化为像素数量来衡量大小的,因为只有像素数量最直观。

(2)、计算dp的方法

  • 通常来说,我们写程序时几乎没用到计算dp,就是直接凭着自己的感觉写的。此处计算dp只是为了大家更好理解dp,如果有的人想精确设置控件大小,也可以这样计算的。
  • 我直接画张图吧: 
  • 计算dp往往是由程序员完成的,是创造的过程,顺叙的过程。但是写程序总会有两个历程的,一个是进行写,一个是返回读,这个读的话就用到了将dp转换了。

(3)、dp转px—(最常用的方法)

  • 前面已经看到一个例子了如下(注:等号都是等价,是理解上的等于,不是直接的等于的):安卓中如果手机每英寸有160px,即手机是160dpi,那么此时1dp就可以理解为1px,假如现在手机是240dpi,那么1dp=240/160 px=1.5px, 
    从上可以看出dp转px只与屏幕的dpi有关。
  • 对于android 来说,最终我们能读懂或者衡量的都是px,所以最后我们都将dp化为px好理解一点。我总结了dp转px的公式如下:
  • 公式:dp值×(当前dpi/160dpi)=>得出当前的像素数目

(4)、手机屏幕dp最大值是多少?

  • 那么问题来了,一个手机屏幕最大有多大的dp呢,我能不能设置成100000dp呢?其实这也是我所思考的,下面我慢慢来讲。
  • 假如现在将控件宽度设置为160dp,那不同dpi的手机所得到的像素是多少呢? 
     
    从中可以看出最后所得像素值与dpi值相同,也就是说不管什么屏幕160dp,就相当于1英寸。
  • 所以要得到全屏最长的的dp,就等于160*宽(或者高英寸长) 
    如第三个1080*1920例子,160*3=480dp,所以0-480dp就是宽的dp范围。因为480*360/160=1080个像素,正好等于宽的最大像素数量。




  • px:

    即像素,1px代表屏幕上一个物理的像素点;

    px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同,如下图所示(图片来自android developer guide,下同)。

    偶尔用到px的情况,是需要画1像素表格线或阴影线的时候,用其他单位如dp会显得模糊。

    dp:

    这个是最常用但也最难理解的尺寸单位。它与“像素密度”密切相关,所以首先我们解释一下什么是像素密度。假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度,像素密度的单位dpi是Dots Per Inch的缩写,即每英寸像素数量。横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。

    不同的手机/平板可能具有不同的像素密度,例如同为4寸手机,有480x320分辨率的也有800x480分辨率的,前者的像素密度就比较低。Android系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。例如界面上有一个长度为“80dp”的图片,那么它在240dpi的手机上实际显示为80x1.5=120px,在320dpi的手机上实际显示为80x2=160px。如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”,这就是使用dp作为单位的效果,见下图。

    更新20140701: 是不是所有android手机的屏幕宽度用dp衡量都是固定值(例如320dp)呢?答案是否定的,如果写一个程序画宽度等于320dp的横线,在不同手机上运行,会发现在有些手机上横线比手机屏幕短,有些则比屏幕长,在平板上与手机上相比差别则更加明显。

    dip:

    与dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,后来为了与sp统一就建议使用dp这个名字了。

    sp:

    与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。

    还有几个比较少用到的尺寸单位:

    mm:

    即毫米;

    in:

    即英寸,1英寸=2.54厘米(约);

    pt:

    1pt=1/72英寸=0.035厘米;

    最佳实践:

    文字的尺寸一律用sp单位,非文字的尺寸一律使用dp单位。例如textSize="16sp"、layout_width="60dp";偶尔需要使用px单位,例如需要在屏幕上画一条细的分隔线时:

    <View layout_width="match_parent" layout_height="1px"/>

    最后,推荐一张Android UI设计参考图:Android Design Cheat Sheet

    参考资料:

    Difference of px, dp, dip and sp in Android?Supporting Multiple Screens
    DisplayMetrics

时间: 2025-01-14 05:12:06

Android开发中dp、dpi、px的区别(转)的相关文章

Android开发中dp,sp和px之间的转换

本文转载于 http://blog.csdn.net/student9128/article/details/53932470 众所周知,在Android开发中dp和px,sp和px之间的转换时必不可少的,下面将转换的代码记录下来: 1 public class DisplayUtils { 2 /** 3 * convert px to its equivalent dp 4 * 5 * 将px转换为与之相等的dp 6 */ 7 public static int px2dp(Context

Android开发中.toString()和String.valueOf()的区别

其实,很多时候效果是差不多的 但是,有的时候用.toString()会报错,而用String.valueOf()就不会报错 这说明两者是有差别的,在细微之处~ .toString()和String.valueOf()的区别在哪呢? jdk的文档中对.toString()有说明: String.valueOf(Object   o)  if the argument is null, then a string equal to "null ";  otherwise,  the val

关于android的单位dp与px

原文:Android中dp和px之间进行转换 官方文档:http://developer.android.com/guide/practices/screens_support.html The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a "medium&quo

Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

android开发中应该注意的问题

1. Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效. 2. 数据库表段字段常量和SQL逻辑分离,更清晰. 3. 全局变量放全局类中,模块私有放自己的管理类中,不要相信庞大的管理的东西会带来什么好处,可能是一场灾难. 4. 如果数据没有必要加载,私有模块数据务必延迟初始化,谨记为用户节省内存,总不会有坏处. 5. 异常抛出,集中到合适的位置处理,不要抛出来异常立即捕获,搞的到处是catch. 6. 地址

Android开发中无处不在的设计模式——单例模式

对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的同学,这里推荐2本书.一本是Head First系列的Head Hirst Design Pattern,英文好的可以看英文,可以多读几遍.另外一本是大话设计模式. 这篇文章介绍一个模式,就是单例模式,因为个人觉得这个模式理解起来最容易,而且不是太复杂. 首先了解一些什么是单例,从名字中就可以听出来

Android 开发中的日常积累

欢迎Star,Fork https://github.com/lizhangqu/CoreLink 里面记录了开发过程中有用的东西,欢迎补充,不定时更新. Android 性能优化 Android内存优化之OOM Android最佳性能实践(1):合理管理内存 Android最佳性能实践(2):分析内存的使用情况 Android最佳性能实践(3):高性能编码优化 Android最佳性能实践(4):布局优化技巧 Android 加固与反编译 Apktool dex2jar DecompileApk

android开发中的5种存储数据方式

数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstance State保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整