根据图像大小调整ImageViews大小

时间:2013-03-29 22:59:58

标签: android image imageview

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

首先,我根据特定的显示器(是,监视器,不是手持设备的屏幕)具有特定大小的图像。图像基于以下特定设置:

  • 1600x900 20“显示器,96ppi

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

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

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

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

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

  1. ImageView高度和宽度(使用LayoutParams)设置为图像的高度(246像素)。我这样做是因为WRAP_CONTENT没有采取应有的行动。
  2. 使用ImageView.ScaleType.CENTER尝试确保ImageView的大小与图片完全相同。
  3. 这些事情似乎都没有影响产出。

    更新

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

    我开始放弃了。

    我使用的设备是MK802III Rockchip设备(Amazon Link

2 个答案:

答案 0 :(得分:2)

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

px = dp * (dpi / 160)

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

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

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

这解释了将图像保存在drawable-hdpi文件夹中时图像显得较小的原因。

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

碰巧:

  

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

     

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

如果您的设备是LDPI(120dpi)而不是报告的MDPI(160dpi),那么这是我期望的图像缩放。

答案 1 :(得分:1)

我讨厌回答我自己的问题,但我只想更新每个人所做的事情。如果有人想出一个更好的解决方案,我会全力以赴。我不得不强迫这一点,因为我的时间紧迫。

我创建了一个虚拟应用程序来转储我可以测量的框。使用这些,我确定1毫米是3密度像素。让我再说一遍, 1mm = 3dp

使用此值,我将所有图像(使用PHP脚本)调整为此约束。我的所有图像都正常显示。 195dp = 65mm,就像这样。

就像我说的那样,任何解释为什么我必须这样做,你得到一个upvote和答案。