画布缩放会到达点(0,0)

6

我在缩放画布方面遇到了问题。我已经创建了一个自定义视图,在其中绘制关系图,但是当我将画布缩小时,它会回到位置(0,0)。我查看了不同的线程和问题,但没有找到合适的答案。

在onDraw方法中我正在进行以下操作。

  canvas.scale(mScaleFactor, mScaleFactor);

我也看到了canvas.scale(x, y, px, py)方法,但我不知道如何获取x和y的旋转中心点。

public boolean onScale(ScaleGestureDetector detector) {

mScaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(0.4f, Math.min(mScaleFactor, 5.0f));
if(mScaleFactor>=1)
   mScaleFactor=1f; 

invalidate();
return true;

}


请多贴一些代码。如果没有看到所有的拼图,帮助你会很困难。 - Christopher Perry
2个回答

11

枢轴点基本上是您的画布围绕其进行变换的点,因此使用枢轴为0,0进行缩放会使其朝该点缩小。使用以下方法,您可以将枢轴点更改为任何位置:

canvas.scale(x, y, px, py);

现在来说一些新东西: 如果你想让画布以其中心为缩放中心,你只需要知道画布中心的坐标:

float cX = canvas.getWidth()/2.0f; //Width/2 gives the horizontal centre
float cY = canvas.getHeight()/2.0f; //Height/2 gives the vertical centre

接着,您可以使用这些坐标进行缩放:

canvas.scale(x, y, cX, cY);

这将使我的图像位于屏幕中央。 - sajjoo
我想缩放手指之间的区域,并且应该在同一点进行缩放,就像谷歌地图一样。 - sajjoo
1
在这种情况下,您需要获取两个触摸点,并从中计算中心: cX = Math.abs(point1.getX() - point2.getX())/2; cY = Math.abs(point1.getY() - point2.getY())/2; - Jave
1
我能想到的唯一可能是画布的左上角不在屏幕的左上角。那么坐标可能需要偏移以匹配画布... :S - Jave
感谢您详细介绍这种方法,Jave。 - Sipty
显示剩余2条评论

-1

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