3

我知道这个标题听起来像是重复的,但我认为我在这里有一个非常具体的情况,我无法从我的所有搜索中解决。

首先,我有基于特定监视器(是的,监视器。不是手持设备的屏幕)的特定尺寸的图像。这些图像基于以下特定设置:

  • 1600x900 20" 显示器,96ppi

现在,所有图像的大小必须以毫米为单位(顺便说一句,它们是方形图像,因此高度 = 宽度)。使用这些特定设置作为决定因素,1mm = 3.78px。所以,我的图像是使用这个来调整大小的。例如,对于显示为 65 毫米的图像,我将图像大小设置为 246 像素。我使用这些设置在 Photoshop 中对此进行了测试,实际上测量屏幕上的图像确实是正确的。

所以现在在我的 Android 应用程序中,我将这些图像加载ImageViews到显示中。这就是我卡住的地方。该设备是 MDPI 设备。如果我将图像加载到 MDPIdrawables文件夹中,则图像在显示器上显得太大。使用上面的示例,我将其转换Drawable为 aBitmap并将图像的高度转储到我的日志中。这是正确的,显示为 246 像素,但由于某种原因,它的测量值远远超过 85 毫米而不是 65 毫米。

如果我将所有图像加载到 HDPI 中(是的,我知道它是一个 mdpi 设备,因此它将由 Android 操作系统调整大小),图像的高度(使用我的示例)转储为 164 像素并出现在大约 50 毫米处。这更容易解释,但我仍然对如何让这些图像像在 Photoshop 中那样出现感到困惑。

所以我的问题是,以编程方式将ImageView其大小调整为图像的确切大小的最佳方法是什么?对于我的示例,我需要找出为什么我的 246px 方形图像(96ppi)没有像应有的那样显示为 65mm。

因为这些ImageViews 是通过编程方式生成的,所以我尝试了以下两件事:

  1. ImageView高度和宽度(使用LayoutParams)设置为图像的高度(246 像素)。我这样做的想法WRAP_CONTENT是没有按照应有的方式行事。
  2. 用于ImageView.ScaleType.CENTER尝试确保ImageView尺寸与图像完全一致。

这些东西似乎都没有影响输出。

更新:

我已验证我的设备是 MDPI 设备。这意味着由于 1:1 的关系,不需要 DPI 到 PX 的转换(反之亦然)。在某个地方,尺寸正在增加,我无法确定在哪里。正如我在下面答案的评论中指出的那样,当我拉出我的 Drawable 并将其转换为位图时,它会拉出我制作的精确像素高度。我开始计算与应有的尺寸差异的百分比(65mm 与 85mm),结果为 23.529%。我正在缩放我的位图减去这个值,但它破坏了我的图像质量。

我开始放弃了。

我正在使用的设备是 MK802III Rockchip 设备(亚马逊链接

4

2 回答 2

2

Android 使用以下公式修改所有要显示的图像:

px = dp * (dpi / 160)

其中“dpi”是设备显示屏的每英寸点数的屏幕密度。

drawable此外,Android在决定显示哪个图像时会查看文件夹的层次结构。众所周知,HDPI 设备将使用drawale-hdpi文件夹中的图像,而 MDPI 设备将显示drawable-mdpi目录中相同的命名图像。

但是,当 MDPI 设备在目录中找不到图像时drawable-mdpi,它最终会从drawable-hdpi文件夹中进行选择,但会缩小图像以显示在 MDPI 屏幕上。

这解释了为什么当您将图像保存在drawable-hdpi文件夹中时,它会显得更小。

drawable-mdpi但是,它没有解释为什么图像在正确放置在文件夹中时显得太大。

碰巧的是:

65mm ~= 85mm * (120 / 160)

50mm ~= 85mm * (120 / 240)

This is the scaling that I would expect for your images if your device were LDPI (120dpi) instead of MDPI (160dpi) as reported.

于 2013-03-29T23:39:22.943 回答
1

I hate answering my own question, but I am just going to update everyone what I did. If someone comes up with a better solution, I am all ears. I had to force this along because I am on a tight deadline.

I created a dummy application that dumped boxes that I could measure. Using these, I determined that 1 millimeter is 3 density pixels. Let me repeat that, 1mm = 3dp.

Using this value, I resized all of my images (utilizing a PHP script) to this constraint. All of my images are appearing as normal. 195dp = 65mm, and it appears as such.

Like I said, any explanation as to why I had to do this and you get an upvote and answer.

于 2013-03-30T11:43:46.943 回答