【问题标题】:Calculate logical pixels from millimeters从毫米计算逻辑像素
【发布时间】:2018-04-03 17:55:03
【问题描述】:

我有一个宽度、高度、填充...以毫米为单位的设计。我现在正试图弄清楚如何将这些数字转换为 Flutter 使用的逻辑像素系统。
我找到了the docs for the device pixel ratio,但我不确定如何解释这个数字,我引用了:

Flutter 框架以逻辑像素运行,因此很少需要直接处理这个属性。

所以我不确定这是否是要走的路。
我的问题归结为:有没有一种简单的方法可以计算出适用于 Android 和 iOS 的从毫米到逻辑像素的简单方法?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    我会说当前接受的答案并不准确。

    您可以打印真实手机的逻辑像素数,如下所示:

    maxWidth = MediaQuery.of(context).size.width; 
    maxHeight = MediaQuery.of(context).size.height; 
    print("maxWidth = $maxWidth / maxHeight = $maxHeight");
    

    如果有真正的 iPhone 和 iPad 的人可以运行此代码并告诉我生成的 maxWidth 和 maxHeights,我将不胜感激。到目前为止,对于 Android 手机,我已经将结果与真实手机尺寸进行了比较。我得到的是这样的:

    • Galaxy S6 ➜ 高度为 5.668537826 dp/mm,宽度为 5.668537826 dp/mm。
    • Galaxy S7 ➜ 高度为 5.668537826 dp/mm,宽度为 5.668537826 dp/mm。
    • Galaxy S9 ➜ 高度为 5.223614747 dp/mm,宽度为 5.585946405 dp/mm。
    • Pixel XL ➜ 高度为 5.612956709 dp/mm,宽度为 6.007177748 dp/mm。

    在此处查看我的电子表格: https://docs.google.com/spreadsheets/d/1zmGyeKSf4w4B-bX4HSY4oSuh9RkIIkFwYSd3P9C7eX8/edit?usp=sharing

    更新:

    【讨论】:

    • 然后提交一个错误。因为它应该是固定的。可能是Flutter获取的pixelratio不正确,导致数字无效。
    • 到目前为止,我在文档中找到的唯一参考是这里:docs.flutter.io/flutter/dart-ui/Window/devicePixelRatio.html。它说每毫米大约有 3.8 个逻辑像素。这在实践中显然是非常错误的。
    • 也在这里找到它:developer.android.com/training/multiscreen/…,上面写着:“一个 dp 是一个虚拟像素单位,大致等于中等密度屏幕上的一个像素(160dpi;“基线”密度)。”
    • 单位不变。它不像像素。没有这样的“三星/谷歌手机有不同的下降”。这是不可能的。
    • 雷米,你链接的维基百科文章说它是 160 dpi,但你链接的维基百科文章的来源说它“大约”是 160 dpi。所以单位不是常数,维基百科的文章是错误的。而现实情况是,在测量时,每部手机的逻辑像素都是不同的。现实决定什么是可能的,而不是维基百科。
    【解决方案2】:

    Flutter 的单位是 DP 或 dip(又称密度无关像素)。 就像它的名字所暗示的那样,它与屏幕像素比无关。

    与毫米有什么区别?没有什么真正重要的。 转换 mm>dp 或 dp>mm 类似于 mm>inch/inch>mm。

    它们之间的关系相当简单:

    1 英寸 = 25.4 毫米 = 160.0 DP

    这意味着 1 毫米 = 6.299 DP

    【讨论】:

    • 嘿,你从哪里弄来的?对于我测试过的任何 Android 手机,在实践中似乎都不是这样。
    • flutter.io/widgets-introThe MyAppBar widget creates a Container with a height of 56 device-independent pixels
    • 我去过那里,但没有说明毫米或英寸的数量。
    • device-independent pixel 是一个名为dpdip 的官方单位,具有我上面列出的等价物。他们不需要解释。根据定义,单位与英寸/毫米有关
    • 无论如何,不​​幸的是在实践中并非如此。
    【解决方案3】:

    逻辑像素是每单位距离(mm)的点的比率,所以你必须把你的问题改为每毫米有多少点代表1个逻辑像素?

    正如上面提到的here

    Flutter 遵循类似 iOS 的简单的基于密度的格式。资产可能 为 1.0x、2.0x、3.0x 或任何其他乘数。 Flutter 没有 dps 但有逻辑像素,基本相同 与设备无关的像素。所谓 devicePixelRatio 表示 单个逻辑像素中物理像素的比例。

    如前所述,1.0x 逻辑像素比在 Android 密度限定符中代表 mdpi。根据thismdpi ≃ 160DPIdpi 表示在 1 英寸(2.54 厘米)的跨度内可以排成一行的单个点的数量:

    160dpi = 160 dots per inch = 6.299 dots per mm
    

    因为mdpi ≃ 160DPI 和 1 个逻辑像素代表mdpi 所以:

    1.0x logical pixel ratio ≃ 6.299 dots per mm
    

    【讨论】:

      【解决方案4】:

      以实际大小显示小部件。

      double millimeterToSize(double millimeter) => millimeter * 160 * 0.03937;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多