px,dp,dip,sp,in,mm,pt详细分析

px   :(pixels),屏幕的像素点,不同的设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。

dip  :(device independent pixels),设备独立像素,这个和设备硬件有关,一般我们为了支持WCGA、HVGA和QVGA推荐使用这个,不依赖于像素。等同于dp。

dp   :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px。

sp   :(scaled pixels—best for text size),带比例的像素,与dp相似,但还会根据用户的字体大小偏好来缩放。Google建议使用sp作为文本的单位,其它用dip。

in    :(inches)英寸

mm :(millimeters)毫米

pt    :(points),磅,1/72 英寸

针对dip和px 的关系,做以下概述:

QVGA屏density=120;          QVGA(240*320)

HVGA屏density=160;          HVGA(320*480)

WVGA屏density=240;         WVGA(480*800)

WQVGA屏density=120          WQVGA(240*400)

density值表示每英寸有多少个显示点,与分辨率是两个概念。

不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例

density=120时

屏幕实际分辨率为240px*400px (两个点对应一个分辨率)

density=160时

屏幕实际分辨率为320px*533px (3个点对应两个分辨率)

density=240时

屏幕实际分辨率为480px*800px (一个点对于一个分辨率)

apk的资源包中

当屏幕density=320时,使用xhdpi 标签的资源

当屏幕density=240时,使用hdpi 标签的资源

当屏幕density=160时,使用mdpi标签的资源

当屏幕density=120时,使用ldpi标签的资源。

不加任何标签的资源是各种分辨率情况下共用的。

布局时尽量使用单位dip,少使用px

dp与px换算公式:

pixs =dips * (densityDpi/160).

dips=(pixs*160)/densityDpi

dp与px转换的方法:

public static int dip2px(Context context, float dipValue){

  final float scale = context.getResources().getDisplayMetrics().density;

  return (int)(dipValue * scale +0.5f);

}

public static int px2dip(Context context, float pxValue){

  final float scale = context.getResource().getDisplayMetrics().density;

  return (int)(pxValue / scale +0.5f);

}

如何获得设备的屏幕分辨率和屏幕密度?

例如分辨率为480*800,密度为240的设备,方法如下:

DisplayMetrics dm =getResources().getDisplayMetrics();

可以获取到:

dm.densityDpi=240

dm.widthPixels=480

dm.heightPixels=800

名词解释

Px(Pixel像素)

不同设备显示效果相同。这里的“相同”是指像素数不会变,比如指定UI长度是100px,那不管分辨率是多少UI长度都是100px。也正是因为如此才造成了UI在小分辨率设备上被放大而失真,在大分辨率上被缩小。

Screen Size(屏幕尺寸)

一般所说的手机屏幕大小如1.6英寸、1.9英寸、2.2英寸,都是指的对角线的长度,而不是手机面积。我们可以根据勾股定理获取手机的宽和长,当然还有面积。

Resolution(分辨率)

指手机屏幕垂直和水平方向上的像素个数。比如分辨率是480*320,则指设备垂直方向有480个像素点,水平方向有320个像素点。

Dpi(dots per inch 像素密度)

指每英寸中的像素数。如160dpi指手机水平或垂直方向上每英寸距离有160个像素点。假定设备分辨率为320*240,屏幕长2英寸宽1.5英寸,dpi=320/2=240/1.5=160

注意:该值对应于DisplayMetrics类中属性densityDpi的值

Density(密度)

指每平方英寸中的像素数。

Density=Resolution/Screen size

注意:在DisplayMetrics类中属性density的值为dpi/160,可用于px与dip的互相转换

Dip(Device-independent pixel,设备独立像素)

同dp,可作长度单位,不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。dip和具体像素值的对应公式是dip值 =设备密度/160* pixel值,可以看出在dpi(像素密度)为160dpi的设备上1px=1dip

Sp(ScaledPixels 放大像素)

主要用于字体显示(best for textsize)。根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。

HD

HD就是高分辨率数字电视的标准,分辨率为1280px x 720px,(720p/720i)

FHD

(Full FD),分辨率为1920px x 1080px , (1080p/1080i)

QHD

Quarter High Definition(FULL HD 1920×1080px的四分之一(面积)),分辨率为960x540px

Android开发中为适配上述三个分辨率下的资源文件,各资源文件夹名为:

HD:     drawable-sw360dp-xhdpi

FHD:   drawable-sw540dp-xhdpi

QHD:  drawable-sw270dp-xhdpi

这里的sw<N>dp表示这个文件夹下面的布局文件只有在设备短边的最小宽带为N时才加载。例如设备是960x540px的分辨率,那么这个apk安装在你的设备上就会加载 layout-sw480dp里面的布局文件,注意Manifest.xml中还需要设置。

================================================================================================

其他参考:

http://blog.sina.com.cn/s/blog_61f4999d0100laxg.html

1.          什么是density

1)         density
density表示每英寸有多少个显示点(逻辑值),它的单位是dpi:dot per inch,通常屏幕大时,density就大,屏幕小时,density就小,通常
屏幕实际分辨率为240px*400px时,density=120
屏幕实际分辨率为320px*533px,density=160
屏幕实际分辨率为480px*800px,density=240

2)         分辨率
是整个屏是多少点,比如800x480,它是软件的显示单位

3)         从Android1.6版本开始支持density(对应API Level 4)
用于解决应用在屏幕大小不同的硬件上正常显示的问题

2.          相关代码及设置

1)         AndroidManifest.xml
<supports-screens android:anyDensity="true"/>
<uses-sdk android:minSdkVersion="4"></uses-sdk>
这个参数在API Level 4也就是SDK 1.6以后才启用的,而且1.6版本的API Level 4的应用默认值就是True

2)         资源目录名(android 2.0以后)
res/xxx-hdpi         当density为240时,使用此目录下的资源
res/xxx-mdpi        当density为160时,使用此目录下的资源
res/xxx-ldpi          当density为120时,使用此目录下的资源
res/xxx                 不常后缀,为默认设置,同xxx-mdpi

3)         资源单位(xml文件中定义大小的单位)

a)        dp=dip=dx (Density independent pixel)
基于屏幕密度的抽象单位,设备无关的点,用于说明与密度无关的尺寸和位置。这些单位是相对于一个160dpi的屏幕,所有一个dp是160dpi屏幕上的一个点。

b)         px
px指软件的单位点,设备相关的点

c)          具体使用

i.              布局时尽量使用单位dip,少使用px
若使用px,如果设某控件大小400x400px,在800x480上显示正常,而在533x320的屏上就超出屏幕了
若使用dp,如果设某控件大小为160x160dp,就可以通过从系统中取density来算出真正的大小,比如在800x480屏的density设为240,而533x320屏的density设为160,借以下公式计算
pixels = dips * (density / 160)
在800x480在屏中显示240象素,而在533x320的屏中显示为160象素,控件在屏中显示的比例是一样的。

ii.              内部的处理过程分为三步:
取screen中其它元素,转为应用的值,计算应用各控件位置,然后再转成800x480以供真正显示
若res-xxx不存在,则读取res有的资源,然后对其做相应缩放

3.          实现density的关键源码

1)         BitmapFactory.java(用于缩放图片)

2)         ComptibilityInfo.java(用于位置计算)

http://zjf1428.javaeye.com/blog/686132

长度单位dp、sp和px的区别

看到有很多网友不太理解dp、sp和px的区别:现在这里介绍一下,dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp或sp。但如果设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换.

___________________________________________________________________________________________________________________
http://www.189works.com/article-32053-1.html
1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这    这个,不依赖像素。 
    这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。 
     dip的换算: 
           dip(value)=(int) (px(value)/1.5 + 0.5) 
2. dp: 很简单,和dip是一样的。 
3. px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。 
4.  sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
备注: 根据google的推荐,像素统一使用dip,字体统一使用sp  
举个例子区别px和dip:
px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。
而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。

public static int dip2px(Context context, float dipValue){ 
                final float scale = context.getResources().getDisplayMetrics().density; 
                return (int)(dipValue * scale + 0.5f); 
        } 
        
    public static int px2dip(Context context, float pxValue){ 
                final float scale = context.getResources().getDisplayMetrics().density; 
                return (int)(pxValue / scale + 0.5f); 
        } 

px,dp,dip,sp,in,mm,pt详细分析相关推荐

  1. Android常用计量单位详解(px,in,mm,pt,dp,dip,sp)

    Android常用计量单位详解(px,in,mm,pt,dp,dip,sp) 在传统PC软件开发中经常以像素为单位设计计算机用户界面.例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素, ...

  2. 2021年最全Android屏幕适配的度量单位px dp(dip) ppi dpi sp pt的区别(最详细,屏幕尺寸,屏幕分辨率,屏幕兼容,屏幕适配)

    0 前言 快乐李同学最新在学习Android屏幕适配相关的知识点,其中涉及到了很多Android屏幕适配相关概念和度量单位,但是快乐李同学掌握的相关知识不牢固,于是决定写出这两篇文章对这方面的知识点做 ...

  3. android 尺寸转换 dp sp in mm pt px转换为int

    在android开发中,在自定义view中有些函数只接受int参数,而我们经常使用的尺寸单位是dp.sp这些,那如何将它们转换为int型呢? int spToInt=TypedValue.applyD ...

  4. 浅谈屏幕适配 dp dip sp dpi ppi px sp

    一.Drawable资源文件夹之间的关系 Android开发中,UI一般会制作多种图片素材,根据素材的分辨率大小,放在如下几个文件夹中: Android 工程里 res 目录下的 drawable-h ...

  5. Android的计量单位px,in,mm,pt,dp,dip,sp

    px   :是屏幕的像素点 in    :英寸 mm :毫米 pt    :磅,1/72 英寸 dp   :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px dip  :等 ...

  6. px,in,mm,pt,dp,dip,sp 之间的换算公式以及区别 屏幕密度

    px   :是屏幕的像素点 in    :英寸 mm :毫米 pt    :磅,1/72 英寸 dp   :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px dip  :等 ...

  7. px,in,mm,pt,dp,dip,sp 之间的换算公式以及区别

    px   :是屏幕的像素点 in    :英寸 mm :毫米 pt    :磅,1/72 英寸 dp   :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px dip  :等 ...

  8. px,dp与sp的区别以及换算

    1.px 即像素,1px代表屏幕上的一个物理像素点. "pixel" 的缩写,像素.是画面显示的基本单位,真实的像素并不是点或者方块(虽然有时这样显示),也没有实际固定长度,只是一 ...

  9. .net开发安卓入门 - 布局与样式(像素单位px、dp、sp的区别)

    .net开发安卓入门 - 布局与样式 布局 LinearLayout RelativeLayout TableLayout RecyclerView ListView GridView GridLay ...

最新文章

  1. java bufferedimage颜色_使用BufferedImage进行渐变色操作
  2. 不要瞧不起技术,项目中有了技术管理会让项目经理很省心
  3. 3116 高精度练习之加法
  4. 把C++类成员方法直接作为线程回调函数
  5. 在linux下安装星际译王
  6. 转载:Linux命令之查看文件占用空间大小-du,df
  7. idea配置远程服务器实现远程编辑文件及ssh连接
  8. Key_handle的学习
  9. html5的修改滚动条滑块样式,修改element-ui滚动条样式
  10. php输入一个字符串 输出所有组合,C++_C语言实现输入一个字符串后打印出该字符串中字符的所有排列,本文实例讲述了C语言实现输入 - phpStudy...
  11. 非常新能源铝电池项目的产业化展开的分析报告v1.1
  12. 从明年1月开始,Oracle要对JDK8就要收费了,怎么办?
  13. python数据分析与应用第四章实训答案_《python数据分析与应用》第四章:pandas统计分析基础...
  14. 【编译原理实验】词法分析(Thompson)
  15. 公众号可快速查询审计报告,鉴别真伪!太方便了……
  16. TCP的三次握手和四次断开
  17. python+django-mezzanine安装
  18. svn客户端在服务器创建项目,win7下安装svn服务器端及客户端详细步骤
  19. Kubernetes CSI(一):介绍
  20. Android自学资源大整合

热门文章

  1. Mysql Server原理简介
  2. 最近看到的一档综艺节目
  3. Hamachi(蛤蟆吃)使用步骤及问题解决【非官方=,=】
  4. HTML用于布局网页页面的元素,HTML div布局标签元素
  5. 网页设计基础——01
  6. estore电子商城-知识整合
  7. 第二天linux基础
  8. 一个新的项目:狼人杀(七)
  9. 程序员要离职,说出什么样的理由?
  10. 实践小项目----美颜相机滤镜功能(图像数据化处理)