- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Android Studio 来显示一个 imageView。我正在使用捏缩放与我的 ImageView 交互。
代码:
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener{
@Override
public boolean onScale(ScaleGestureDetector detector) {
scale = scale * detector.getScaleFactor();
scale = Math.max(0.1f, Math.min(scale, 5f));
matrix.setScale(scale, scale);
imageView.setImageMatrix(matrix);
return true;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
scaleGestureDetector.onTouchEvent(event);
return true;
}
缩放没问题,但问题是 ImageView 的位置,它卡在左上角。尝试更改布局但无能为力。经过一些研究,我在论坛中看到了这些链接 ImageView Center in position with ScaleType Matrix和 Center the image in ImageView after zoom-pinch ,但这些解决方案不起作用,我还检查了里面给出的链接。
帮助将不胜感激,
谢谢!
编辑:添加了一段关于如何获取 ImageView 的代码
Picasso.with(this).load(url).resize(350, 330).centerInside().into(imageView);
onCreate 代码
ScaleListner 类和手势代码
最佳答案
Picasso.with(this).load(url).into(imageView, new Callback.EmptyCallback() {
@Override
public void onSuccess() {
Drawable d = imageView.getDrawable();
// TODO: check that d isn't null
RectF imageRectF = new RectF(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
RectF viewRectF = new RectF(0, 0, imageView.getWidth(), imageView.getHeight());
matrix.setRectToRect(imageRectF, viewRectF, ScaleToFit.CENTER);
imageView.setImageMatrix(matrix);
}
});
编辑 2:
如何像 CENTER_INSIDE
但使用矩阵一样使图像居中:
首先我们需要一个具有图像尺寸的矩形:
Drawable d = imageView.getDrawable();
// TODO: check that d isn't null
RectF imageRectF = new RectF(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
接下来您需要一个具有 View 尺寸的矩形:
RectF viewRectF = new RectF(0, 0, imageView.getWidth(), imageView.getHeight());
现在我们在矩阵上运行一个方法,使图像在 View 中居中:
matrix.setRectToRect(imageRectF, viewRectF, ScaleToFit.CENTER);
它所做的是设置矩阵,以便第一个矩形将转换为第二个矩形。 ScaleToFit.CENTER
将保留纵横比并与缩放类型 CENTER_INSIDE
具有相同的效果。
所以如果你打电话
imageView.setImageMatrix(matrix);
此时,您将拥有居中图像。
编辑:我想你快到了。
您的矩阵将撤消 Picasso 所做的图像居中,因此您需要在缩放之前进行平移以使图像居中。
@Override
public boolean onScale(ScaleGestureDetector detector) {
Drawable d = imageView.getDrawable();
// if d is null, then Picasso hasn't loaded the image yet
float offsetX = (imageView.getWidth() - d.getIntrinsicWidth()) / 2F;
float offsetY = (imageView.getHeight() - d.getIntrinsicHeight()) / 2F;
float centerX = imageView.getWidth() / 2F;
float centerY = imageView.getHeight() / 2F;
// note that these offset and center values don't change with the scaling,
// so you can calculate them somewhere else and then use them here.
scale *= detector.getScaleFactor();
scale = Math.max(0.1f, Math.min(scale, 5f));
matrix.setScale(scale, scale, centerX, centerY);
matrix.preTranslate(offsetX, offsetY);
imageView.setImageMatrix(matrix);
}
您正在使用 setScale(float sx, float sy)
。还有另一个版本,setScale(float sx, float sy, float px, float py)
其中 px,py 是一个枢轴点。
因此,如果您想将图像居中,请确定 View 的中心并使用 x,y 值作为轴心点。
您还希望图像在 View 中居中,因此您需要在缩放之前先移动图像。
float offsetX = (imageView.getWidth() - bitmap.getIntrinsicWidth()) / 2F;
float offsetY = (imageView.getHeight() - bitmap.getIntrinsicHeight()) / 2F;
float centerX = imageView.getWidth() / 2F;
float centerY = imageView.getHeight() / 2F;
matrix.setScale(scale, scale, centerX, centerY);
matrix.preTranslate(offsetX, offsetY);
关于android - 如何将 imageView 与矩阵 scaletype 居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37270053/
我试过修改 xml 但没有成功。 目前发生这种情况:图像出现在我的 TouchImageView 的中心。 ╔═════════════════════════════════════════════
我非常了解 Android 中的 ImageView 缩放。但无法理解完整的 diff b/w scaleTypes:centerCrop 和 centerInside。 需要一些明确的解释。 最佳答
我需要将 ImageView 中的几个图像调整为屏幕大小。目前我使用 scaleType="centerInside",它适用于较大的图像,可以将它们缩小到屏幕尺寸,但不会扩展小图像。 所有其他建议的
为了让我的问题更清楚,我想在布局 xml 中使用 ScaleType ,根据布局宽度(例如 sw-600、sw-720、...等)使用不同的值,并且作为它没有明确的常量值,例如布局权重,我不知道是否可
我的 Android 应用程序出现异常行为。我有这个 XML 配置 但是当我运行应用程序时,结果是这样的 图像1'、2'、3'是正确的,但为什么第一行的第三张图像不正确?此
如何使用保持宽高比的位图填充 ImageView?如果我使用 scaleType="centerCrop" 它会裁剪图像的顶部,我希望它裁剪右侧和底部。谢谢。 最佳答案 你可以读到这个: Link t
我正在尝试实现一个可以容纳横向或纵向图像的 ImageView。这些图像应该适合 imageview 的宽度(如果是横向)或高度(如果是纵向),但在任何情况下它们都必须与 View 的顶部对齐,没有边
起初看起来很简单,但最终结果并不好。我有一个宽度大于屏幕宽度的图像。所以我需要在我的 ImageView 中缩小它。我查看了 ScaleType 选项并尝试了所有选项,但没有一个可以。第一个 "cen
我有一个带有白色背景和 1dp 填充的 Imageview 集,这会产生类似边框的效果,这是想要的结果。 现在,如果我将 scaleType 设置为 centerCrop,它会忽略顶部和底部的填充。
我不知道为什么 scaleType 不适用于这个 ImageView。 widthGrayBlock 是正确的,我用黑色背景检查了它。 ImageView 具有正确的宽度和高度,但图像资源不适合它
我有一个 ImageView ,我想旋转、缩放和缩小或放大并拖动用户触摸。到目前为止,一切都在以良好的方式完美地工作。 我关注了this代码和一些其他代码以获得最佳结果。现在我希望要拖动、移动、缩放和
我对 Picasso 中的占位符图像有疑问。我在我的一个 imageView 上使用 scaleType fitXY,但我真的不想缩放我的占位符,有没有一种方法可以为我的占位符设置不同的 scaleT
我有一个名为 "alumniImage" 的 ImageView,我以编程方式将其设置为 CENTERCROP 的 ScaleType。 但在应用程序中它似乎没有改变。 这是它的代码: Lin
我喜欢使用自定义的(单选)按钮,我知道我可以使用任何图像作为背景,并在 xml 中使用以下代码: 但是:我想使用三个单选按钮来填满整行。但是我用于按钮的 drawable 不会根据 sreensiz
我正在使用 Glide 4.0 将图像加载到具有 scaleType="matrix"的 ImageView 以实现平移和缩放功能。图片不加载居中。如果它很高,它会加载到左侧,如果它很宽,它会在顶部加
我正在尝试使用 ViewPager 和 Volley 的 NetworkImageView 创建一个图片库。 viewpager 和图像检索一切正常。但是当我将位图放入 NetworkImageVie
我有一个正方形 ImageView,它显示不同尺寸的图片。我想始终保持图片的原始纵横比并且图像周围没有边距(以便图像占据整个 ImageView)。为此,我在 ImageView 上使用了 cente
我使用下面的代码来设置 ImageView 的 ScaleType: iv.setScaleType(ScaleType.FIT_END); 它适合右下角。 但我想让图片适合左下角。 我该怎么做? 最
我有一个填满整个屏幕的 ImageView ,我从 url 下载图像到我的 sdcard,我正在使用 AnimationDrawable 将这些图像显示为 ImageView 中的幻灯片。但无论我如何
我想显示带边框的图像。下面的解决方案适用于某些图像,但不适用于其他图像。 到目前为止,我最好的猜测是,它适用于较小的图像,但不适用于大图像。 对于较小的图片,该解决方案可以很好地显示具有 2 像素边框
我是一名优秀的程序员,十分优秀!