ImageView setScaleX / Y,比例因子< 1

时间:2016-04-20 15:31:11

标签: android matrix imageview scaletype

我对ImageView(缩放类型= Matrix)有奇怪的行为。

我有一些父视图(FrameLayout实际上,在图片上标记为灰色)。在此FrameLayout的顶部,我的ImageView位于MATCH_PARENT属性中。

所以我希望ImageView应该填充父视图。我在ImageView中使用不同大小的位图设置不同的情况(使用MATRIX ScaleType)。有时它比ParentView小,有时更大。我想使用imageView.setScaleY(scaleFactor)将位图调整为父界限,如果scaleFactor是>它完全有效。但是如果Bitmap实际上更大并且scaleFactor是< 1,ImageView表现得非常奇怪:ImageView的Drawable被正确缩放并尝试填充所有父视图,但由于某种原因,ImageView边界被缩小(与MATCH_PARENT相比)。结果如下图所示(比例因子约为0.5)。

看起来ImageView的大小是用Bitmap缩小的,我无法使用imageView.setMinimumWidth / Height或LayoutParams来阻止它。

有什么想法吗?

enter image description here

P.S。我无法使用Matrix转换来缩放ImageView(因为它在我的应用中用于不同的目的 - 缩放/移动/旋转)

3 个答案:

答案 0 :(得分:1)

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

我认为您在ImageView缩放ImageView小部件本身中缩放缩放位图令人困惑。这是两件不同的事情。

所以你将ImageView放在FrameLayout MATCH_PARENT的宽度和高度范围内。现在,您的ImageView应与FrameLayout的尺寸相同。一切都很好。

ImageView是一个视图。所有视图都可以缩放(并翻译和旋转)。

当您说imageView.setScaleX()imageView.setScaleY()时,您正在更改小部件的界限。无论布局参数是什么都没关系,您要改变视图的大小。

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

我写了一个捏合/缩放视图并使用了我认为你正在做的scaleType="matrix"。所以我在这里解决了你似乎遇到的问题:

位图带有一定的尺寸。 ImageView一旦布局,就会有一定的尺寸。所以,让我们说位图和ImageView具有相同的尺寸。矩阵的起始比例为1.非常简单。

那么如果尺寸不同呢?您必须计算起始比例。以下是我的工作方式:我创建了一个带有位图尺寸的Rect(src)和另一个带有Rect尺寸的ImageView(dest)。然后我打电话给matrix.setRectToRect(src, dest, ScaleToFit.START)。此方法在矩阵上设置比例因子,以便在位图上应用矩阵时(例如ImageView.setImageMatrix()),位图可以正确调整为ImageView的尺寸。

因为您还没有发布任何代码,所以我很难知道这是多么适用,但希望我在这里发布的内容会让您朝着正确的方向前进。

答案 1 :(得分:0)

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

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

  • 缩放ImageView位图;
  • 不会自动缩放ImageView - imageView.getHeight()返回未缩放的值,DeveloperOptions-> Show Layout Bounds显示未缩放的ImageView;
  • 但是它会缩放ImageView的画布 - 所以ImageView的大小正确,但在 SCALED 画布中渲染位图。

感谢kris larson的帮助

答案 2 :(得分:0)

添加0.7f 例:   v.setScaleX(0.9f);