在Android中进行缩放 - 保持图像在视图中

6

我知道已经有大量的线程讨论了如何实现捏合缩放,但是我已经做到了这一点。

我正在使用SimpleScaleGestureListener处理缩放。我设法确保您无法将图像缩小到比屏幕大小更小(因此您的图像高度始终至少与可用屏幕大小相同)。

但是,我正在寻找一种自动检测图像是否在这些边界之外进行平移的方法。就像标准的Android显示图像的方式一样。所以如果我放大并向上滑动图像,然后缩小,我希望它可以检测到图像底部何时到达屏幕底部,然后“枢轴”缩放调整,从而永远不允许图像本身的上方或下方出现“空白”。有人能帮帮我吗?

以下是我的onScale和onDraw方法:

public boolean onScale(ScaleGestureDetector detector){
    float minScale = (float) ((float) SCREEN_SIZE.y / (float) DRAWABLE_SIZE.y);
    mScaleFactor *= detector.getScaleFactor();
    mScaleFactor = Math.max(minScale, Math.min(mScaleFactor, 5.0f));
    invalidate();
    return true;
}

protected void onDraw(Canvas canvas) {
    canvas.save();
    canvas.drawColor(Color.DKGRAY);
    canvas.translate(mPosX, mPosY);
    canvas.scale(mScaleFactor, mScaleFactor, getDrawable().getIntrinsicWidth() / 2,
    getDrawable().getIntrinsicHeight() / 2);

    this.getDrawable().draw(canvas);
    canvas.restore();
}
2个回答

3

您可以使用android.graphics.Matrix来转换绘制的位图。Matrix将缩放比例和平移位置保存其中。

您只需将Matrix应用到画布上:canvas.setMatrix

您可以轻松计算所需矩形的适合屏幕大小:

Matrix.setRectToRect

这里,source是您的图像(Bitmap)实际分辨率矩形,左/上为0,0,右下为宽度/高度。dst是目标视图的矩形,位于其中将绘制位图。

然后您还可以解决您的任务-了解图像的边框将在哪里绘制。 Matrix.mapRect会计算您的位图矩形(如前所述)在屏幕上以屏幕坐标出现的位置。 然后,您只需确定相对于屏幕左侧绘制图像的左侧位置,同样适用于顶部/右侧/底部。

我不会给您代码,只提供提示。最近我编写了一个带有缩放、适应屏幕、动画过渡等功能的图像查看器,并且所有这些都是使用Matrix和其操作完成的。


谢谢!我会研究一下矩阵。感谢您不想分享代码,但是您是否有关于矩阵以及如何解决我的具体问题的好资源链接?也许有一个好的教程?当然我会自己搜索,但如果您有任何“顶级”的建议,我将非常感激 :) - Dynde
不知道具体的链接。但是,尝试查找2D变换、矩阵数学等内容。这并不太难,而且矩阵在图形方面非常强大。在Android的画布上,它只是2D矩阵。 - Pointer Null
@mice 你好,能否给我发送这个特定矩阵问题的代码?我想在画布中使用缩放和平移,但是我无法进行平移操作。我已经尝试了谷歌搜索,但是使用矩阵我找不到任何有用的信息。提前感谢您的帮助。 - anddev

2

2
简单的解决方案也可以很棒 :) 然而,我更感兴趣的是学习如何解决这个问题,而不仅仅是使用其他代码 - 尽管它可能作为灵感有用 :) - Dynde
这段代码是从默认的相册应用中提取出来的,我已经很久没有处理它了,我记得最多的就是它有一个默认的图像矩阵,然后在缩放时它的映射矩阵会发生变化。 - ingsaurabh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接