Picasso.with(this).load(url).into(imageView, new Callback.EmptyCallback() {
@Override
public void onSuccess() {
Drawable d = imageView.getDrawable();
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();
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);
这段代码的作用是设置矩阵,使第一个矩形变换为第二个矩形。使用
ScaleToFit.CENTER
可以保持纵横比,并具有与缩放类型
CENTER_INSIDE
相同的效果。
因此,如果您调用
imageView.setImageMatrix(matrix);
此时,您将拥有一张居中的图片。
编辑:我认为您已经接近成功了。
您的矩阵将撤销Picasso所做的图像居中处理,因此您需要添加一个平移操作来使图像居中,然后再进行缩放。
@Override
public boolean onScale(ScaleGestureDetector detector) {
Drawable d = imageView.getDrawable();
float offsetX = (imageView.getWidth() - d.getIntrinsicWidth()) / 2F;
float offsetY = (imageView.getHeight() - d.getIntrinsicHeight()) / 2F;
float centerX = imageView.getWidth() / 2F;
float centerY = imageView.getHeight() / 2F;
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是枢轴点。
如果您想将图像居中,确定视图的中心并使用x、y值作为枢轴点。
您还需要在缩放之前先将图像居中于视图中心。
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);
Log.d
方法,在您每次更改矩阵时随时转储它。 - pskink