相信有不少开发者对于dp/sp/px,这些概念比较模糊,本文将讲解其含义和用途。
基本概念
- px: 像素(pixel),设备上的物理像素点。
- dp:跟dip是同一个概念,与屏幕物理像素点无关,而是基于屏幕密度抽象单位,被称作“设备独立像素”,会随着屏幕的密度进行自动的大小调整。
- sp: 专用于文字大小的设置,可根据字体大小首选项进行缩放。
- inch: 英寸,1英寸 = 2.54厘米。
- dpi: 屏幕像素密度, 单位英寸上像素点的数量。
- 分辨率: 是指横纵方向上的像素点数,单位是px。一般是纵向像素*横向像素,比如1920 * 1080
- 屏幕尺寸: 屏幕对角线的长度,单位是inch。比如我们平时常说的5寸手机,是指手机屏幕的对角线长度为5英寸。
转换关系
常见尺寸表
level | dpi | scale | resolution |
---|---|---|---|
ldpi | 120 | 0.75 | 320*240 |
mdpi | 160 | 1 | 480*320 |
hdpi | 240 | 1.5 | 800*480 |
xhdpi | 320 | 2 | 1280*720 |
xxhdpi | 480 | 3 | 1920*1080 |
xxxhdpi | 640 | 4 | 2560*1440 |
说明:
- google官方用的词是approximately,比如ldpi是值近似等于120dpi;
- 分辨率列只是比较有代表性的而已,但设备的dpi,还需要根据相应的设备尺寸来计算。同一分辨率,设备尺寸越大,那么dpi就越小,单位英寸上像素点越稀疏。
换算公式
android.util.TypedValue类提供了一个函数,提供所有单位与px的换算关系。
-
dpi如何计算?
dpi,英文全称dot per inch,是指每英寸上的像素点个数。 计算公式:dpi=√(X²+Y²)/Z (其中 X:纵向的像素个数;Y:横向的像素个数;Z:屏幕尺寸) -
scale是如何计算的?
定义以160dpi作为基准,当前设备的dpi/160dpi = scale值。也就是当设备的dpi为160时1dp=1px. -
dp与px如何转换?
计算公式:pxs = dps * (dpi/160),
比如:320dpi的设备,10dp转换为px为 10 *(320/160)px = 20 px,即320dpi下10dp=20px. -
1dp到底等于多长呢?
假设设备的dpi=320, 是指320px对应的长度为1英寸, 那么1px=1/320 英寸。再根据前面的公式, 1dp = (320/160) px = 2px。故1dp对应的长度为2 * (1/320)英寸,即1/160英寸。
同理,假设设备的dpi =N,那么1dp = (N/160) px = (N/160) * (1/N) inch = 1/160 inch,再加上前面提到的近似,可以得出结论为1dp约等于1/160英寸。
多屏适配
适配原则
- layout中,最好采用wap_content, fill_parent,dp,可保证在屏幕上有合适的大小;
- 像素单位使用dp, 文字单位使用sp;
- 程序代码中不要出现具体的px;
- 图片应多使用.9.png;
- 使用百分比布局;
适配方法
- 查看不同分辨率的设备市场占有率,分析出需要支持的设备分辨率:
- 对不同大小的屏幕提供不同的layout;
- 对不同密度的屏幕提供不同的图片;
FEATURED TAGS
android
组件
else
权限
algorithm
web
tool
java
performance
app
debug
process
memory
jvm
linux
binder
ipc
handler
系统启动
AMS
Bitmap
mobile
gradle
wait
多线程
线程状态
并发
线程安全
数据结构
内存泄露
equals
hashcode
Android Studio
https
Effective
exception
动态代理
base64
crash
github
git
ndk
JavaScript
Charles
Android
C
ViewTreeObserver
xposed
JNI
annotations
maven
ANR
GCC
C++
printf
C语言高级专题
native
nm