为什么wrap_content的大小会大于实际像素大小?

3

我想要理解一些东西。我看到一个奇怪的事情是,当我在宽度和高度中使用wrap_content时,图像的尺寸比插入的真实像素大小要大。为什么会这样呢?

我的代码中使用了wrap_content

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="false"
    android:src="@drawable/header" />

这是我的代码,其中图片的像素大小精确指定:

 <ImageView
    android:id="@+id/imageView1"
    android:layout_width="378px"
    android:layout_height="155px"
    android:adjustViewBounds="false"
    android:src="@drawable/header" />

正如您所看到的,这是确切的像素大小:

为什么会这样呢?我以为wrap_content应该根据内容大小包裹视图,那为什么在屏幕上它会更大呢?


你正在测试的设备密度是多少?header文件夹在哪个目录中? - Mohsin Naeem
这是我的问题,它与屏幕密度有关吗?如果是,那么是怎样的呢?wrap_content到底是做什么用的?我想补充一下,我使用px而不是pd。 - roiberg
4
当然,它与设备密度有关。wrap_content只是简单地将内容包装起来 :) 但是,如果您的图像位于mdpi文件夹中,而您的设备是hdpi,那么您的图像看起来会很小,因为它在缩放后显示图像(378 x 155)/1.5,但在mdpi设备上,它会以(378 x 155)的形式显示。 - Mohsin Naeem
太好了!没错,我把它放在hdpi上,所以才会出现这种情况。我正在xwga(720P)上使用它,当我将其放入xhdpi时就正确了!谢谢! - roiberg
5个回答

5
如果你真的需要使用图像的像素原尺寸,并且使用屏幕实际像素,请执行以下操作:
1)创建一个res/drawable-nodpi文件夹,并将固定像素非缩放图像移动到其中。
2)然后,您可以使用wrap_content作为layout_width和layout_height,图像像素将与设备像素匹配,因为dpi没有进行任何放大。
http://developer.android.com/guide/practices/screens_support.html中了解nodpi的定义:
适用于所有密度的资源。这些是密度独立的资源。无论当前屏幕的密度如何,系统都不会缩放带有此限定符标记的资源。

4
http://developer.android.com/guide/practices/screens_support.html上提供了支持多屏幕的非常好的解释。
在缩放后的各自文件夹中放置图像。
例如,如果您想要100*100的图像,则将其放置在以下位置:
低密度设备的drawable-ldpi中为75*75; 中等密度设备的drawable-mdpi中为100*100; 高密度设备的drawable-hdpi中为150*150; 超高密度设备的drawable-xhdpi中为200*200。

1

wrap_content 意味着您希望图像保持其原始大小。例如,如果图像的大小为200*200,则它将显示200*200,如果图像大小为400*400,则它将显示大小为400*400的图像。 因此,当您使用实际像素硬编码时,您得到比实际尺寸更大的图像的原因是图像的尺寸很大。也就是说,图像实际上很大。


0

你需要查看你放置图片的位置。如果它在hdpi中,那么在屏幕上它看起来会比在使用wrap_content时的hdpi更大。因此,为了使其大小精确,请将其放入正确的库中。


0
从我的经验来说,我可以说wrap_content总是尽可能利用最大可用的空间。所以有时它会拉伸图片,有时会缩小图片的尺寸。想要使用精确大小的图片,请使用android:scaleType="fitXY"
<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="false"
    android:scaleType="fitXY"
    android:src="@drawable/header" />

第1、2条评论后更新:

根据Android文档:


你可以通过精确的测量来指定宽度和高度,但通常不需要经常这样做。更常见的是,您将使用其中一个常量来设置宽度或高度:

wrap_content 可以使视图的大小适应其内容所需的尺寸

fill_parent(在 API 级别 8 中已重命名为 match_parent)告诉您的视图变得与其父视图组允许的大小一样大。

通常不推荐使用绝对单位(如像素)指定布局宽度和高度。相反,使用相对度量单位,例如密度无关像素单位(dp)、wrap_content 或 fill_parent 更好,因为它有助于确保您的应用程序能够在各种设备屏幕尺寸上正确显示。可接受的测量类型在“可用资源”文档中定义。


我发现术语大小本身很重要,它可以自动调整图像的大小。这就是为什么我说从我的经验来看,有时它会拉伸图像,有时会缩小图像。


谢谢,但它不起作用。fitXY不是答案。一旦我将其更改为wrap_content,它就会变得更大,并且仅使用fitXY会更改图像的比例而不是视图大小。 - roiberg
我找到了答案,它在问题的评论中。这是一个棘手的问题。谢谢。 - roiberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接