69

嗨,我对 Android Drawable 类的两种方法感到困惑

getIntrinsicHeight()
getIntrinsicWidth()

api定义说 http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()

内在高度/宽度这个词是什么意思?我的意思是它是实际图像的宽度吗?

4

3 回答 3

147

如果你想知道intrinsic的含义,它只不过是一个对象所拥有的实际属性。在我们的例子getIntrinsicWidth/Height中,只是意味着为您提供该可绘制对象的默认宽度/高度。

这将返回您放入资源文件夹中的可绘制对象的确切大小,而无需进行任何修改。

现在您必须知道getWidthgetHeight将返回一个值,该值可能会根据您ImageView在 XML 布局中为您指定的宽度和高度而变化。

假设您在 XML 布局中提供了ImageViewas的宽度和高度,100*100 并且用作背景的可绘制对象的大小为 200*200。

现在getIntrinsicWidth必须返回 200 而getWidth必须返回 100。

于 2012-12-07T05:27:34.993 回答
13

stackoverflow 上的相关问题。

如果您的图像是从互联网上下载的,.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 个版本,并手动缩放它们),您必须小心提到的 androidal 用词不当。

于 2015-01-26T21:35:28.380 回答
4

在 android 中,drawable 可以有多种类型,例如颜色、位图、形状等。

其中一些可绘制对象具有固有高度,例如作为图像尺寸的 BitmapDrawable。

诸如 ColorDrawable(仅用于绘制纯色)之类的 Drawable 没有固有高度。在这种情况下,getIntrinsicHeight/Width 的值返回 -1。

即使drawable没有内在的高度/宽度,每个drawable都需要设置它们的边界才能渲染自己(即在你调用mydrawable.draw(canvas)之前)

如果您使用可绘制对象作为视图的背景,则视图会在内部为您设置边界。但是如果您在自己的 onDraw 中使用可绘制对象,则需要通过 setBounds 显式设置边界。

于 2013-05-14T00:09:11.930 回答