嗨,我对 Android Drawable 类的两种方法感到困惑
getIntrinsicHeight()
getIntrinsicWidth()
api定义说 http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()
内在高度/宽度这个词是什么意思?我的意思是它是实际图像的宽度吗?
嗨,我对 Android Drawable 类的两种方法感到困惑
getIntrinsicHeight()
getIntrinsicWidth()
api定义说 http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()
内在高度/宽度这个词是什么意思?我的意思是它是实际图像的宽度吗?
如果你想知道intrinsic的含义,它只不过是一个对象所拥有的实际属性。在我们的例子getIntrinsicWidth/Height
中,只是意味着为您提供该可绘制对象的默认宽度/高度。
这将返回您放入资源文件夹中的可绘制对象的确切大小,而无需进行任何修改。
现在您必须知道getWidth
或getHeight
将返回一个值,该值可能会根据您ImageView
在 XML 布局中为您指定的宽度和高度而变化。
假设您在 XML 布局中提供了ImageView
as的宽度和高度,100*100
并且用作背景的可绘制对象的大小为 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 个版本,并手动缩放它们),您必须小心提到的 androidal 用词不当。
在 android 中,drawable 可以有多种类型,例如颜色、位图、形状等。
其中一些可绘制对象具有固有高度,例如作为图像尺寸的 BitmapDrawable。
诸如 ColorDrawable(仅用于绘制纯色)之类的 Drawable 没有固有高度。在这种情况下,getIntrinsicHeight/Width 的值返回 -1。
即使drawable没有内在的高度/宽度,每个drawable都需要设置它们的边界才能渲染自己(即在你调用mydrawable.draw(canvas)之前)
如果您使用可绘制对象作为视图的背景,则视图会在内部为您设置边界。但是如果您在自己的 onDraw 中使用可绘制对象,则需要通过 setBounds 显式设置边界。