我发现Canvas的坐标系单位与屏幕的坐标系不同。
例如,在我的情况下如下:
对于一个特定点,其从ImageView.getX()
和ImageView.getY()
获得的屏幕坐标是(336, 578)
。
然后,通过反复尝试,我在画布上画了一个点,使这个点与ImageView完全位于同一位置我调用了canvas.drawCircle(330, 440, radius, paint);
来实现这一点。
问题来了:
为什么两个坐标(336578)和(330440)会不同
是因为屏幕和画布使用不同的单位吗?
这是关于像素、dp等的问题吗?
您可以尝试使用View.getLocationInWindow
转换到窗口坐标和从窗口坐标转换,这样您将始终确保使用相同的坐标系。
ImageView.getX
和Y
的坐标是相对于父坐标的。画布坐标是相对于视图的。这可能导致的差异
编辑:我假设在一个地方可以得到视图的坐标(使用getX
和getY
)。将这些转换为窗口坐标。称这些为viewXY[]
。
当您需要使用它们时,要在画布中绘制,还可以将顶部和左侧坐标转换为窗口坐标。我们称之为canvasXY[]
。
现在,要绘制的X
位置将是viewXY[0] - canvasXY[0]
,而Y
位置将是viewXY[1] - canvasXY[1]
。
视图的位置坐标始终相对于其父视图。这就像在说,相对于它的父对象,这个视图放在哪里。
还有一件事,屏幕坐标。这说明了这个对象相对于窗口顶部/左侧(想想实际的物理屏幕)的位置。这可以通过View.getLocationOnScreen
获得。
如果你想比较两个位置,只有当这两个位置的父视图相同或你使用的是绝对屏幕坐标时,它们才会相等。否则,你只会得到"看起来"不同的结果。
如果你想把两者统一起来,要么把它们放在一个共同的父对象上,要么使用绝对坐标。