Android 带比例因子的ImageView设置比例X/Y<;1.

Android 带比例因子的ImageView设置比例X/Y<;1.,android,matrix,imageview,scaletype,Android,Matrix,Imageview,Scaletype,我对ImageView有奇怪的行为(比例类型=矩阵) 我有一些父视图(实际上是框架布局,在图片上标记为灰色)。在此FrameLayout的顶部,我的ImageView与MATCH_父属性一起定位 所以我希望ImageView应该填充父视图。在ImageView(使用矩阵ScaleType)的不同情况下,可以设置不同大小的位图。有时它比ParentView小,有时比ParentView大。我想使用imageView.setScaleY(scaleFactor)将位图调整到父边界,如果scaleFa

我对ImageView有奇怪的行为(比例类型=矩阵)

我有一些父视图(实际上是框架布局,在图片上标记为灰色)。在此FrameLayout的顶部,我的ImageView与MATCH_父属性一起定位

所以我希望ImageView应该填充父视图。在ImageView(使用矩阵ScaleType)的不同情况下,可以设置不同大小的位图。有时它比ParentView小,有时比ParentView大。我想使用imageView.setScaleY(scaleFactor)将位图调整到父边界,如果scaleFactor大于1,它完全可以工作。但若位图实际上更大,且scaleFactor<1,则ImageView的行为相当奇怪:ImageView的Drawable被正确缩放并尝试填充所有父视图,但由于某些原因,ImageView边界被缩小(与匹配父视图相比)。结果如下图所示(比例因子~0.5)

因此,看起来ImageView的大小是通过位图缩小的,我无法通过使用ImageView.setMinimumWidth/Height或LayoutParams来阻止它。

有什么想法吗


另外,我无法使用矩阵变换缩放ImageView(因为它在我的应用程序中用于不同的用途-缩放/移动/旋转)

如果没有看到您的代码,我很难回答,但我会猜一猜

我认为您混淆了在
ImageView
中缩放位图和缩放
ImageView
小部件本身。这是两件不同的事情

因此,您将
ImageView
放在
FrameLayout
中,并使用
MATCH\u PARENT
匹配宽度和高度。现在,您的
ImageView
应该与您的
FrameLayout
大小相同。一切都很好

ImageView
是一个视图。所有视图都可以缩放(以及平移和旋转)

当您说
imageView.setScaleX()
imageView.setScaleY()
时,您正在更改小部件的边界。不管布局参数是什么,您都在更改视图的大小

现在,
ImageView
很特别,因为它有自己的方法来缩放源图像而不改变其边界。这使用的是
scaleType
属性。因此,使用
ImageView
可以更改图像的大小,而无需更改
ImageView
的边界

我编写了一个收缩/缩放视图,并使用了
scaleType=“matrix”
,我认为您正在这样做。下面是我如何解决你似乎遇到的问题:

位图具有特定的尺寸。
ImageView
在布局后具有特定的尺寸。因此,让我们假设位图和
ImageView
具有相同的尺寸。矩阵的起始刻度为1。很简单

那么,如果维度不同呢?你必须计算一个起始刻度。我是这样做的:我创建了一个带有位图维度的
Rect
(src),另一个带有
ImageView
维度的
Rect
(dest)。然后我调用了
matrix.setRectToRect(src、dest、ScaleToFit.START)
。此方法在矩阵上设置比例因子,以便在位图上应用矩阵时(例如
ImageView.setImageMatrix()
),位图的大小正确调整为
ImageView
的尺寸


因为您还没有发布任何代码,所以我很难知道这有多适用,但希望我在这里发布的内容将为您指明正确的方向。

正确的解决方案是使用矩阵变换

经过深入调查,我发现
setScaleX()
方法的工作方式非常奇怪:

  • 缩放图像视图位图
  • 不单独缩放ImageView-ImageView.getHeight()返回未缩放的值,DeveloperOptions->ShowLayout Bounds显示未缩放的ImageView
  • 但是它缩放ImageView的画布-因此ImageView具有正确的大小,但在缩放的画布中渲染位图
感谢克里斯·拉森的帮助

添加0.7f 例子:
v、 设置刻度(0.9f)

我想你的ImageView在那里,你就是看不见。尝试为ImageView指定背景色,或者更好的做法是向矩阵添加x&y转换,即
matrix.postTranslate(x,y)
。您应该能够看到ImageView使用了整个区域。x&y转换只需在ImageView“窗口”中移动我的位图即可。但是ImageView getWidth()返回正确的值(与父视图相同)。这有什么帮助?哦,我明白了。您可能认为,如果位图更大,则需要将其缩小更多。事实证明,ImageView将调整位图的大小以适应,然后变为scale==1。因此,无论使用什么大小的位图,缩放都会得到相同的结果。因此,当我放大一个小位图时,它会变大,并且ImageView会调整位图边框(填充上图中的灰色区域)。当位图大于灰色区域时,ImageView无法调整位图(因为匹配父属性)。调用setScaleX()后,ImageView将缩小(到红色区域边界)+位图将缩小到灰色区域。对吗?我无法理解ImageView的渲染顺序。位图调整为ImageView,反之亦然?感谢您解释
ImageView
详细信息。唯一的问题是,我不能在我的应用程序中使用
矩阵
变换,因为我已经将其用于图像编辑,处理额外的矩阵缩放非常不舒服。