【问题标题】:What is the unit of the coordinate system of Canvas? - androidCanvas坐标系的单位是什么? - 安卓
【发布时间】:2013-07-12 06:51:19
【问题描述】:

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

以我为例如下:

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

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

问题来了:

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

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

这是关于像素、dp 等的问题吗?

【问题讨论】:

    标签: android android-canvas android-drawable android-screen


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • View.getLocationInWindow得到的窗口坐标是什么意思?
    • 这似乎很有道理。我怎样才能统一2个坐标?谢谢!
    • 我添加了更多关于这样做的描述。希望对你有帮助
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这很有意义。所以我可以用屏幕绝对位置在画布上绘制点??我该怎么做? canvas.drawCircle(x, y, radius, paint) 中的 x 和 y 只是 2 个浮点数。如何告诉函数我要使用屏幕绝对位置?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2017-06-08
    • 2019-06-23
    • 2018-12-19
    • 1970-01-01
    相关资源
    最近更新 更多