安卓中的getIntrinsicHeight和getIntrinsicWidth是什么意思?

71

2
Android中,为什么ImageView中Drawable的宽度和高度是错误的? - mathheadinclouds
3个回答

157
如果您想了解"intrinsic"的含义,它实际上是指对象所拥有的实际属性。在我们的例子中,"getIntrinsicWidth/Height"意味着为您提供该可绘制对象默认的宽度和高度。
这将返回资源文件夹中放置的可绘制对象的确切大小,而不进行任何修改。
现在您需要知道,"getWidth"或"getHeight"将返回一个值,该值可能根据您在XML布局中为"ImageView"指定的宽度和高度而异。
假设您在XML布局中为"ImageView"指定了宽度和高度为"100*100",并且您使用的背景可绘制对象的大小为"200*200"。
现在,"getIntrinsicWidth"必须返回"200",而"getWidth"必须返回"100"。

谢谢,我明白了。但是现在我正在从URL下载图像(并将其加载到ImageView中),它的固有高度和宽度与在浏览器中访问时不同,比所报告的要大,但在你上面的示例中,你说它们应该是相同的。 - user1697965
也许你正在下载时缩放图像。我不确定对于已下载的图像这能起多大作用,但至少对于我在drawable中拥有的那些图像是有效的。 - Andro Selva
11
错误的。正确答案在这里:https://dev59.com/WVjUa4cB1Zd3GeqPUskT - mathheadinclouds
4
警告 - intrinsicHeight 受屏幕密度的影响,不能用作获取实际源图像尺寸的可靠测量标准 - 请查看 @mathheadinclouds 提供的链接。当然,Android 文档从未说明这一点 - 导致全球开发人员浪费了数百万小时。 - RunLoop
错误的。这会给出一个取决于屏幕密度的数字。 - auspicious99

13

在Stack Overflow上有相关问题

如果您下载的图片来自互联网,.getIntrinsicWidth().getIntrinsicHeight()确实可以分别给出图像的“真实”宽度和高度。

它被称为内在尺寸,因为它仅取决于图像本身,而不取决于其他任何因素(例如您的手机)。

但遗憾的是,在某些情况下,您得到的结果并不是所有情况下都是内在的 - 它确实与除图像之外的其他事物有关。

以下情况会导致您得到错误的(非内在的)结果。比方说,如果您使用的是默认的启动器图标,则

Log.i("", "ic_launcher intrinsic width " + getResources().getDrawable(R.drawable.ic_launcher).getIntrinsicWidth());

该代码将告诉您启动器图标的宽度(以像素为单位)。但是哪一个? - 您有几个,一个在drawable-xhdpi文件夹中,一个在drawable-hdpi文件夹中等等。如果您的设备是xhdpi,它会给您96,这确实是驻留在drawable-xhdpi文件夹中的启动器图标版本的像素宽度。现在,删除drawable-xhdpi文件夹中的图标,然后再次运行(仍然使用xhdpi设备(真实或模拟))。将使用来自drawable-hdpi文件夹的图像,因为那是最接近xhdpi版本的图像。该图标的像素宽度为72。但是上面的代码仍将给出96!!!

显然,这不是“本质”(按照单词的正常意义),因为它不仅取决于所使用的图像。

因此,如果您和我一样懒惰,因此没有生成每个资源图标/图像的4个版本(而是只使用1或2个,并手动缩放它们),那么您必须注意所提到的安卓误称。


4
在Android中,可绘制对象可以是许多类型,例如颜色、位图、形状等。其中一些可绘制对象具有固有高度,例如图片可绘制对象,其高度为图像的尺寸。
诸如ColorDrawable(用于绘制纯色)之类的可绘制对象没有固有高度。在这种情况下,getIntrinsicHeight / Width的值返回-1。
即使可绘制对象没有固有高度/宽度,在调用mydrawable.draw(canvas)之前,每个可绘制对象都需要设置其边界才能呈现自己。
如果您将可绘制对象用作视图的背景,则视图会在内部为您设置边界。但是,如果您在自己的onDraw中使用可绘制对象,则需要通过setBounds显式设置边界。

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