缩放android - 保持图像在视野中

Dyn*_*nde 5 java android zoom pinch

我知道有很多线程实际上实现了捏缩放 - 但我已经做到了这一点.

我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)

Poi*_*ull 3

您可以使用 android.graphics.Matrix 来转换绘制的 Bitmap。矩阵同时包含比例和平移。

您只需将矩阵应用到画布:canvas.setMatrix

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

Matrix.setRectToRect
Run Code Online (Sandbox Code Playgroud)

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

然后你还可以解决你的任务 - 知道图像的边界将在哪里绘制。Matrix.mapRect 将计算位图的矩形(如前所述)将在屏幕坐标中出现在屏幕上的位置。然后,您可以简单地相对于屏幕左侧绘制图像的左侧,对于顶部/右侧/底部也是如此。

我不会给你代码,只是提示你该走哪条路。我最近编写了具有捏缩放、适合屏幕、动画过渡等功能的图像查看器,所有这些都是使用 Matrix 及其操作完成的。