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

news/2024/11/15 3:22:34/

1、px

即像素,1px代表屏幕上的一个物理像素点。
“pixel” 的缩写,像素。是画面显示的基本单位,真实的像素并不是点或者方块(虽然有时这样显示),也没有实际固定长度,只是一个抽象的取样。设计中的像素和实际显示屏上的像素相对应。

屏幕的分辨率一般就描述为“宽向像素数X纵向像素数”。比如 Android手机常见的分辨率有:320 X 480, 480 X 800, 1080 X 1920等。

2、dp

dip:device independent pixels(设备独立像素),dp与dip一样,不同的设备有不同的显示效果,一般为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。
定义dp为 160dpi 时的一个像素大小;那么到 320 dpi 时,它就相当于两个像素。

px= dp (dpi/160)
这样的话,假如做一个50
50dp的icon,放到160dpi的屏幕上就是50px50px,放到320dpi的屏幕上就是100px100px。各元素的布局和比例便不会失调。

3、sp

sp:scale-independent pixels(缩放独立像素),与缩放无关的抽象像素,它和dp很相似,但唯一的区别在于,Android系统允许用户自定义文字尺寸大小(小,正常,大,超大等),当文字尺寸是“正常”时,1sp=1dp=0.00625inch(英寸),当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625inch
这里插一句 sp 这个单位,sp 跟 dp 类似,全称是 scale-independent pixel (也会缩写为 sip), 即“独立比例像素”。sp 主要用作字体的单位,开发用此单位设置文字大小,这样在不同像素密度的屏幕上能进行同比例的扩大缩小。

4、dpi

dpi是像素密度,指的是在系统软件上指定的单位尺寸的像素数量,它往往是写在系统出厂配置文件的一个固定值

我为什么要强调它是软件系统上的概念?
因为大家买手机的时候,往往会听到另一个叫ppi的参数,这个在手机屏幕中指的也是像素密度,但是这个是物理上的概念,它是客观存在的不会改变。dpi是软件参考了物理像素密度后,人为指定的一个值,这样保证了某一个区间内的物理像素密度在软件上都使用同一个值。这样会有利于我们的UI适配。

比如,几部相同分辨率不同尺寸的手机的ppi可能分别是是430,440,450,那么在Android系统中,可能dpi会全部指定为480.这样的话,dpi/160就会是一个相对固定的数值,这样就能保证相同分辨率下不同尺寸的手机表现一致。

我们可以说,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。

dpi:dots per inch(每英寸点数,或者说每英寸像素数目 更易懂),即:是指屏幕上每英寸(1英寸 = 2.54 厘米)距离中有多少个像素点。如果屏幕为 320*240,屏幕长 2 英寸宽 1.5 英寸,Dpi = 320 / 2 = 240 / 1.5 = 160。
由设备决定,是写死的,可以通过context.getResources().getDisplayMetrics().densityDpi获取到。当然,也可以通过以下方法算出:

dpi=横向分辨率/横向英寸数=纵向分辨率/纵向英寸数
安卓手机种类多样,有各种屏幕像素密度。比如120dpi是低密度(ldpi)类型,160dpi 是中密度(mdpi),240dpi是高密度(hdpi),320dpi是超高密度(xhdpi),480dpi是超超高密度(xxhdpi)。

Google 规定的屏幕密度列表:

ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi

就如有的UI给的图会有这样的标注:

5、 ppi

这个在手机屏幕中指的也是像素密度,但是这个是物理上的概念,它是客观存在的不会改变
dpi是软件参考了物理像素密度后,人为指定的一个值,这样保证了某一个区间内的物理像素密度在软件上都使用同一个值。这样会有利于我们的UI适配

6、 in

inches的缩写,英寸。就是屏幕的物理长度单位。一英寸等于2.54cm。比如Android手机常见的尺寸有5寸、5.5寸、6寸等,这里的长度都是指手机对角线的长度。

7、pt

“points” 的缩写,点。一个点等于1/72英寸,所以“点”也是个长度单位而已。

8、 Density(密度)

这个是指屏幕上每平方英寸(2.54 ^ 2 平方厘米)中含有的像素点数量。

单位的换算:

dpi与density的关系

dpi = density*160

px与density

px = density * dp
px = (dpi / 160)*dp

dp与px

px=dp*(dpi/160)
dp=px/(dpi/160)

sp与px

px=sp*(dpi/160)
sp=px/(dpi/160)

获取DisplayMetrics对象方法:

DisplayMetrics dm=new DisplayMetrics();
//获得DisplayMetrics对象方法一
//dm=context.getResources().getDisplayMetrics();
//获得DisplayMetrics对象方法二
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);

px转其他单位代码:(该方法来自TypedValue)

public static float applyDimension(int unit, float value,DisplayMetrics metrics){switch (unit) {case COMPLEX_UNIT_PX:return value;case COMPLEX_UNIT_DIP:return value * metrics.density;case COMPLEX_UNIT_SP:return value * metrics.scaledDensity;case COMPLEX_UNIT_PT:return value * metrics.xdpi * (1.0f/72);case COMPLEX_UNIT_IN:return value * metrics.xdpi;case COMPLEX_UNIT_MM:return value * metrics.xdpi * (1.0f/25.4f);}return 0;}

另外一种px转dp的代码:

/** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */  public static int px2dip(Context context, float pxValue) {  final float scale = context.getResources().getDisplayMetrics().density;  return (int) (pxValue / scale + 0.5f);  }

dp转px:

/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */  public static int dip2px(Context context, float dpValue) {  final float scale = context.getResources().getDisplayMetrics().density;  return (int) (dpValue * scale + 0.5f);  }



作者:枫叶1234
链接:https://www.jianshu.com/p/a895dbed1c3b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://www.ppmy.cn/news/327208.html

相关文章

手工搓一块全盘模拟SLC的SM2259XT+英特尔N18,全盘不掉速,附SM2259XT开卡软件,SM2258XT可参考

这两天在家收拾杂物,发现手头居然还有十来颗英特尔的N18 01T QLC颗粒。这个颗粒,一句话概括就是,食之无味,弃之可惜。要速度没速度,要寿命没寿命。一直听各路大佬在讨论可以把N18开成全盘模拟SLC,可以全盘不…

一文吃透Spring集成MyBatis

个人主页: 几分醉意的CSDN博客_传送门 文章目录 💖集成思路✨怎么使用MyBatis✨集成的步骤✨pom加入依赖✨创建MyBatis使用代码✨创建Service类✨创建Spring配置文件和测试集成MyBatis✨使用外部属性配置文件 💖图书推荐 Java28岁了&#xff…

【算法题解】38. 括号的生成

这是一道 中等难度 的题 https://leetcode.cn/problems/generate-parentheses/ 题目 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["…

结构化命令

章节目录: 一、使用 if-then 语句二、if-then-else 语句三、嵌套 if 语句四、test 命令4.1 数值比较4.2 字符串比较4.3 文件比较 五、复合条件测试六、if-then 的高级特性6.1 使用单括号6.2 使用双括号6.3 使用双方括号 七、case 命令八、结束语 本章内容&#xff1…

华为OD机试真题 JavaScript 实现【最长的连续子序列】【2022Q4 100分】

一、题目描述 有N个正整数组成的一个序列,给定一个整数sum,求长度最长的的连续子序列使他们的和等于sum,返回该子序列的长度,如果没有满足要求的序列返回-1。 二、输入描述 第1行有N个正整数组成的一个序列。 第2行给定一个整…

苹果X更换电池-苹果x电池寿命80%要换吗?

手机电池寿命小于80%,是否需要更换电池,这主要取决于用户的使用体验。苹果电池更换。 我爱家电维修网告诉你如果感觉还可以,没有明显的使用经验,不一定需要立即更换,可以继续使用。 如果感觉寿命明显下降,…

苹果x面容id不可用是什么原因_iPhone X显示面容ID不可用,大神一招FaceID恢复

iPhone X显示面容ID不可用,大神一招Face ID恢复正常,解锁无忧 Face ID(面容ID)是iPhone X的安全解锁功能,也是iPhone X的最大亮点,只需要一眼就可以安全地解锁。但iPhone X面容ID不可用是实际维修中最常见的故障,也是这…

苹果x面容id不可用是什么原因_iPhone X使用体验!苹果手机那么保值是有原因的...

在竞争如此激烈的手机市场之下,苹果所要面临的压力同样巨大。在2018年第二季度的出货量报告中便可得知,华为已经赶超苹果,跃居全球第二。在众多国产手机品牌快速崛起的环境之下,苹果的销量更加难以稳定。不得不承认的是&#xff0…