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