什么是像素密度
每个屏幕都有一个“物理像素(physical pixel)”。
Flutter 使用的单位不是物理像素,而是 逻辑像素(logical pixel,也叫 device-independent pixel, DIP)。
像素密度(devicePixelRatio) 就是:1 逻辑像素 = ? 物理像素即 设备物理像素 和 Flutter 逻辑像素 的比例。
物理像素 (physical pixel) 是屏幕硬件决定的,客观固定。而 逻辑像素 (logical pixel / dp) 并不是硬件原生的,而是 操作系统定义的抽象单位。
操作系统确实会为每台设备定义逻辑像素大小
Android 用的是 **dp (density-independent pixel)**表示逻辑像素
iOS 用的是 **point (pt)**表示逻辑像素
iOS:是固定的(例如 iPhone X 的逻辑宽 375pt,高 812pt)。
Android:系统根据分辨率和屏幕密度计算出一个默认逻辑像素数(比如 1080px 宽的手机,可能对应 360dp 宽)。
一旦逻辑像素大小确定,就能推算出 devicePixelRatio=物理像素/逻辑像素,所以它在 默认情况下 确实是固定的。
但是逻辑像素并不是完全“硬编码”的固定值,用户可以自定调节
- iOS:基本固定,只有在“显示缩放(Display Zoom)”模式下,逻辑像素会改变。
- iPhone 6/7/8 Plus:逻辑分辨率从 414×736pt 变成 375×667pt。
- Android:用户能在设置里调节“显示大小”,会改变逻辑像素的数值。
- 逻辑像素变了,
devicePixelRatio也跟着变。
- 逻辑像素变了,
开发者不能直接改devicePixelRatio,它是系统告诉 Flutter 的,和硬件/系统设置绑定。
devicePixelRatio的作用
适配不同屏幕
- Flutter 统一使用逻辑像素,保证不同设备看起来大小一致。
- 你可以根据
devicePixelRatio决定加载不同清晰度的图片。
图片资源选择
在 Flutter 的 assets 里,可以按倍数放置图片:
assets/
icon.png // 默认 (1.0x)
2.0x/icon.png // 高清 (2.0x)
3.0x/icon.png // 超高清 (3.0x)
当 devicePixelRatio = 3.0 时,Flutter 会自动加载 3.0x/icon.png。
devicePixelRatio 并不一定是整数(1、2、3)。
安卓设备因为分辨率和屏幕尺寸多样化 → 会出现 3.5、2.625、2.75 等值。
Flutter 会自动处理,开发时一般不需要关心具体是不是整数。
- 比如
devicePixelRatio = 3.5,它会在加载图片资源时,从3.0x/和4.0x/文件夹之间选择更合适的。(选择“最接近的倍数”)