android - 根据图像大小调整 ImageViews 的大小

标签 android image imageview

我知道标题听起来像是重复的,但我认为我这里有一个非常特殊的情况,我无法通过所有搜索来解决。

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

  • 1600x900 20 英寸显示器,分辨率为 96ppi

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

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

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

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

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

  1. ImageView 的高度和宽度(使用 LayoutParams)设置为图像的高度 (246px)。我这样做是因为 WRAP_CONTENT 没有按应有的方式行事。
  2. 使用 ImageView.ScaleType.CENTER 尝试确保 ImageView 的大小与图像完全匹配。

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

更新:

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

我开始放弃了。

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

最佳答案

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),我希望您的图像能够缩放。

关于android - 根据图像大小调整 ImageViews 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15712741/

相关文章:

android - 将 android/java 移植到 ios/objective c 的好书

image - 使用 iText 将图像放置在 pdf 的左下角

css - 在表格类中设置 CSS 图像背景时出现问题

android - 内存不足错误 viewpager + imageView

android - 如何在AsyncTask中设置ImageView

android - 通过语音识别发送消息?

java - 在 Java 中生成随机数时出错。 (包括代码和错误)

css - Internet Explorer 模式重写

xcode - 如何更改 ImageView 的图像?

java - Hashmap 不存储整个 base64 字符串