5

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

我正在使用 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();
}
4

2 回答 2

3

您可以使用 android.graphics.Matrix 来转换绘制的位图。Matrix 包含比例和平移。

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

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

Matrix.setRectToRect

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

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

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

于 2011-09-27T11:58:11.730 回答
2

一个简单的解决方案是使用这个小部件

http://blog.sephiroth.it/2011/04/04/imageview-zoom-and-scroll/

于 2011-09-27T11:29:08.397 回答