Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android getIntrinsicHeight和getIntrinsicWidth是什么意思?_Android_Drawable - Fatal编程技术网

android getIntrinsicHeight和getIntrinsicWidth是什么意思?

android getIntrinsicHeight和getIntrinsicWidth是什么意思?,android,drawable,Android,Drawable,嗨,我被Android Drawable类的两个方法弄糊涂了 getIntrinsicHeight() getIntrinsicWidth() api的定义是 “固有高度/宽度”一词是什么意思? 我的意思是它是实际图像的宽度吗?如果你想知道内在的含义,它只不过是一个对象拥有的实际属性。在我们的例子中,getIntrinsicWidth/Height只是指为您提供该可绘制图形的默认宽度/高度 这将返回未经任何修改就放入资源文件夹中的绘图表的确切大小 现在您必须知道getWidth或getHei

嗨,我被Android Drawable类的两个方法弄糊涂了

getIntrinsicHeight()
getIntrinsicWidth()
api的定义是

“固有高度/宽度”一词是什么意思?
我的意思是它是实际图像的宽度吗?

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

这将返回未经任何修改就放入资源文件夹中的绘图表的确切大小

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

假设您已在XML布局中将
ImageView
的宽度和高度设置为
100*100
,并且用作背景的可绘制图形的大小为200*200


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

在安卓系统中,绘图可以有多种类型,如颜色、位图、形状等

其中一些可绘制图形具有固有的高度,例如位图可绘制图形,它是图像的尺寸

诸如ColorDrawable(用于绘制纯色)之类的可绘制对象没有固有的高度。在本例中,getIntrinsicHeight/Width的值返回-1

即使drawable没有固有的高度/宽度,每个drawable也需要在渲染自身之前设置其边界(即在调用mydrawable.draw(canvas)之前)

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

相关问题

如果您的图像是从internet下载的,
.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误称。

谢谢,我明白了。但目前我正在从url下载图像(并将其加载到图像视图中)。如果我在浏览器中访问图像,其固有高度和宽度与原始图像不同,它比报告的图像大,但在上面的示例中,你说它们应该是相同的,也许你在下载时缩放了图像。我不确定这对下载的图像有多大作用,但至少对我的可绘制图像有效。错了。回答正确此处警告-intrinsicHeight因屏幕密度不同而不同,不能用作获取实际源图像尺寸的可靠度量-请参阅@MathHeadIncluds提供的链接当然,Android文档从未声明过这一点-导致全球开发者浪费数百万小时。错误。这给出了一个取决于屏幕密度的数字。请在此处更正答案