Android 带比例因子的ImageView设置比例X/Y<;1.
我对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来阻止它。 有什么想法吗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(因为它在我的应用程序中用于不同的用途-缩放/移动/旋转)如果没有看到您的代码,我很难回答,但我会猜一猜 我认为您混淆了在
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具有正确的大小,但在缩放的画布中渲染位图
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
详细信息。唯一的问题是,我不能在我的应用程序中使用矩阵
变换,因为我已经将其用于图像编辑,处理额外的矩阵缩放非常不舒服。