【问题标题】:ImageView setScaleX/Y with scale factor < 1ImageView setScaleX/Y 比例因子 < 1
【发布时间】:2016-04-20 15:31:11
【问题描述】:

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

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

所以我希望 ImageView 应该填充父视图。我在 ImageView 中设置了不同大小的位图(使用 MATRIX ScaleType)。有时它比 ParentView 小,有时比 ParentView 大。我想使用 imageView.setScaleY(scaleFactor) 将位图调整为父边界,如果 scaleFactor > 1,它完全可以工作。但是如果 Bitmap 实际上更大并且 scaleFactor

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

有什么想法吗?

附:我无法使用矩阵变换缩放 ImageView(因为它在我的应用中用于不同目的 - 缩放/移动/旋转)

【问题讨论】:

  • 我认为你的 ImageView 在那里,你只是看不到它。尝试为 ImageView 分配背景颜色,或者更好的是,将 x&y 转换添加到矩阵,即matrix.postTranslate(x,y)。您应该能够看到 ImageView 使用了整个区域。
  • x&y 翻译只是在 ImageView“窗口”中移动我的位图。但 ImageView getWidth() 返回正确的值(与父视图相同)。它有什么帮助?
  • 哦,我明白了。您可能在想,如果位图更大,那么您需要进一步缩小它。事实证明,ImageView 会调整位图的大小以适应,然后变成 scale == 1。因此,无论您使用什么大小的位图,缩放都会得到相同的结果。
  • 所以当我放大一个小位图时 - 它会变大并且 ImageView 会调整位图边框(填充上图中的灰色区域)。当位图大于该灰色区域时 - ImageView 无法调整位图(因为 MATCH_PARENT 属性)。调用 setScaleX() 后,ImageView 缩小(到红色区域边框)+ 位图缩小到灰色区域。这是正确的吗?我只是无法理解 ImageView 的渲染顺序。位图调整为 ImageView 还是反之?

标签: android matrix imageview scaletype


【解决方案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),用ImageView 尺寸创建了另一个Rect (dest)。然后我打电话给matrix.setRectToRect(src, dest, ScaleToFit.START)。此方法设置矩阵的比例因子,以便当您将矩阵应用于位图(例如ImageView.setImageMatrix())时,位图的大小会正确调整为ImageView 的尺寸。

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

【讨论】:

  • 感谢您解释 ImageView 详细信息。唯一的问题 - 我不能在我的应用程序中使用 Matrix 转换,因为我已经将它用于图像编辑,并且处理额外的矩阵缩放非常不舒服。
【解决方案2】:

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

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

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

感谢克里斯拉森的帮助

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多