嗨,我被Android Drawable类中的两个方法搞糊涂了
getIntrinsicHeight()
getIntrinsicWidth()
接口定义为http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()
“固有高度/宽度”这个词是什么意思?我的意思是它是实际图像的宽度吗?
发布于 2015-01-27 05:35:28
如果你的图片是从互联网上下载的,.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的误用。
发布于 2013-05-14 08:09:12
在android中,可绘制的图形可以有多种类型,如颜色、位图、形状等。
其中一些可绘制图形具有固有的高度,例如BitmapDrawable,它是图像的尺寸。
诸如ColorDrawable (用于绘制纯色)之类的可绘制图形没有固有的高度。在这种情况下,getIntrinsicHeight/Width的值返回-1。
即使可绘制图形没有固有的高度/宽度,每个可绘制图形在渲染自身之前都需要设置它们的边界(即在调用mydrawable.draw(Canvas)之前)
如果使用可绘制的作为视图的背景,则该视图将在内部为您设置边界。但是,如果您在自己的onDraw中使用可绘制内容,则需要通过setBounds显式设置界限。
https://stackoverflow.com/questions/13756910
复制相似问题