flutter:devicePixelRatio像素密度

  1. 什么是像素密度
  2. devicePixelRatio的作用

什么是像素密度

每个屏幕都有一个“物理像素(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.52.6252.75 等值。

Flutter 会自动处理,开发时一般不需要关心具体是不是整数。

  • 比如 devicePixelRatio = 3.5,它会在加载图片资源时,从 3.0x/4.0x/ 文件夹之间选择更合适的。(选择“最接近的倍数”)

×

喜欢就点赞,疼爱就打赏