6

我发现Canvas的坐标系单位和screen的不同。

例如在我的情况如下:

对于一个特定的点,它的屏幕坐标是从ImageView.getX()和获得ImageView.getY()(336, 578)

然后通过反复试验,我在 Canvas 上绘制了一个点,以便该点与 ImageView 的位置完全相同。我打电话canvas.drawCircle(330, 440, radius, paint);来实现这一目标。

问题来了:

为什么 2 个坐标 (336, 578) 和 (330, 440) 会不同?

是不是因为屏幕和画布使用了不同的单位?

这是关于像素,dp和所有这些的问题吗?

4

2 回答 2

1

视图的位置坐标总是相对于它的父级。这就像说,这个视图相对于它的父级放置在哪里。

还有另一件事,屏幕坐标。这表示该对象放置在相对于窗口顶部/左侧(想想实际的物理屏幕)的位置。这可以通过View.getLocationOnScreen.

如果您想比较两个位置,只有当这两个位置的父视图相同或您使用的是绝对屏幕坐标时,它们才会等效。否则,您只会得到“看起来”不同的结果。

如果你想统一这两者,要么将它们带到一个共同的父级,要么使用绝对坐标。

于 2013-07-12T07:14:27.483 回答
1

您可以尝试使用这种方式在窗口坐标之间进行转换,View.getLocationInWindow您将始终确保您使用的是相同的坐标系。

ImageView.getXan的坐标Y是相对于父级的。画布坐标是相对于视图的。这可能会导致差异

编辑:我假设您在一个地方获得了视图的坐标(使用getXand getY)。将这些转换为窗口坐标。调用这些viewXY[].

当您需要使用它们时,要在画布中绘图,还将顶部和左侧坐标转换为窗口坐标。我们称这些canvasXY[].

现在,X要绘制的位置是viewXY[0] - canvasXY[0]Y位置是viewXY[1] - canvasXY[1]

于 2013-07-12T07:05:23.293 回答