android getIntrinsicHeight和getIntrinsicWidth是什么意思?

您好,我从Android Drawable类的两个方法困惑

getIntrinsicHeight() getIntrinsicWidth() 

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

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

如果你想知道内在的意义,那只不过是一个客体所拥有的实际财产。 在我们的例子中,getIntrinsicWidth / Height仅仅意味着为你提供该drawable的默认高度或宽度。

这将返回您放在资源文件夹中的drawable的确切大小,而不进行任何修改。

现在,您必须知道getWidth或height将返回一个值,该值可能会根据您在xml布局中为ImageView指定的宽度和高度而有所不同。

比方说,你已经在xml布局中提供了你的ImageVIew的宽度和高度为100 * 100,你用作Background的drawable的大小是200 * 200。

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

相关的问题在这里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,并且用手来缩放它们),则必须提防所提到的机器人误用。

在android中,drawable可以有多种types,如颜色,位图,形状等

其中一些drawable有一个固有的高度,如图像的维度BitmapDrawable。

可绘制的ColorDrawable(用于绘制纯色)不具有固有的高度。 在这种情况下,getIntrinsicHeight / Width的值返回-1。

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

如果使用drawable作为视图的背景,视图将在内部为您设置边界。 但是,如果您在自己的onDraw中使用drawable,则需要通过setBounds明确设置边界。