ImageView setScaleX / Y,比例因子<1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ImageView setScaleX / Y,比例因子<1相关的知识,希望对你有一定的参考价值。

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

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

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

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

有任何想法吗?

enter image description here

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

答案

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

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

所以你把你的ImageView放在FrameLayoutMATCH_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的尺寸。

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

另一答案

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

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

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

谢谢kris larson的帮助

另一答案

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

以上是关于ImageView setScaleX / Y,比例因子<1的主要内容,如果未能解决你的问题,请参考以下文章

ImageView属性--缩放类型

android中imageview里的图片大小是不是可以比imageview本身大,如果可以,如何设置?

在 ImageView 中缩放图像(缩放 x,y) - IOS

如何在此应用程序中保持图像视图的纵横比? 【Android、ImageView、长宽比、ScrollView】

ImageView的scaleType属性

为啥我使用postScale缩放图片之后,再使用imageView.layout()这个方法移动图片就没有效果了