我有一个非常简单的测试应用程序,它有一个自定义组件MyView.java-它显示一个可滚动和可缩放的图像(在一个像拼字游戏一样的拼字游戏中代表一个板):
1)在我的缩放侦听器中,我调整缩放因子:

public boolean onScale(ScaleGestureDetector detector) {
    mScale *= detector.getScaleFactor();

    // XXX how to adjust mOffsetX and mOffsetY ? XXX

    constrainZoom();
    constrainOffsets();
    invalidate();
    return true;
}

2)然后在自定义组件的绘图方法中,应用平移和比例因子:
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.translate(mOffsetX, mOffsetY);
    canvas.scale(mScale, mScale);
    gameBoard.setBounds(
        0,
        0,
        gameBoard.getIntrinsicWidth(),
        gameBoard.getIntrinsicHeight()
    );
    gameBoard.draw(canvas);
}

不幸的是,当用捏手势缩放时似乎有一个小错误-
我可以看到,缩放后的比例和边界大小正确,但图像的偏移量不正确。
问题变得更糟,当捏手势的焦点远离屏幕的0,0点时。
用文字描述这个问题有点困难,但当您签出my test project from GitHub时,您会立即看到它(您可以随时双击以重置偏移量和刻度)。
这可能是一个常见的问题,有一个标准的方法来解决它,但我还没有找到它。
电路板图像是CC BY-SA by Denelson83并且代码基于How-to support the fling gesture with a bounce effect博客。

最佳答案

您要移动画布两次:首先使用translate,然后使用scale(sx,sy,px,py);
您可以将焦点与onScale中的偏移量结合起来,然后使用scale(sx,sy)

09-25 18:51
查看更多