比例因子 < 1 的 ImageView setScaleX/Y

ImageView setScaleX/Y with scale factor < 1

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

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

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

所以看起来 ImageView 的大小是用位图缩小的,我不能用 imageView 来阻止它。setMinimumWidth/Height 或 LayoutParams。

有什么想法吗?

P.S。我无法使用矩阵变换缩放 ImageView(因为它在我的应用程序中用于不同目的 - zoom/move/rotate)

没有看到你的代码我很难回答,但我会猜一猜。

我认为您混淆了 ImageView 中缩放位图和 缩放 ImageView 小部件本身 .这是两个不同的东西。

因此,您将 ImageView 放在 FrameLayout 中,宽度和高度为 MATCH_PARENT。现在你的 ImageView 应该和你的 FrameLayout 一样大。一切都很好。

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

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

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

的边界

我写了一个 pinch/zoom 视图并使用了 scaleType="matrix" 我认为你正在做的事情。所以这就是我解决您似乎遇到的问题的方法:

位图有一定的尺寸。 ImageView 布局后具有一定的尺寸。因此,假设位图和 ImageView 具有相同的尺寸。矩阵的起始比例为 1。非常简单。

维度不一样怎么办?您将必须计算起始比例。下面是我的做法:我创建了一个 Rect (src) 位图尺寸,另一个 Rect (dest) 与 ImageView 尺寸。然后我打电话给matrix.setRectToRect(src, dest, ScaleToFit.START)。此方法在矩阵上设置比例因子,以便在位图上应用矩阵时(例如 ImageView.setImageMatrix()),位图的大小会正确调整为 ImageView.

的尺寸

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

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

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

  • 缩放 ImageView 位图;
  • 不自行缩放 ImageView - imageView.getHeight() returns 未缩放的值和 DeveloperOptions->Show Layout Bounds 显示未缩放的 ImageView;
  • 但是 它缩放 ImageView 的 Canvas - 所以 ImageView 有正确的大小,但是在 SCALED Canvas.

感谢克里斯拉尔森的帮助

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