首页 > 解决方案 > 安卓指纹示例中的 quadTo

问题描述

我对 Android 的“fingerpaint”示例有疑问:https ://github.com/Miserlou/Android-SDK-Samples/blob/master/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.java 。有一个细节我似乎无法理解。

在“ACTION_MOVE”运动事件上​​,视图使用该方法将新的路径段绘制到画布上Path.quadTo。这发生在第 104 行。如果我理解正确,路径的当前位置是(mX, mY),并且(x, y)是用户将指针移动到的位置。所以应该画一个从到的quadTo(mX, mY, (x + mX)/2, (y + mY)/2)二次贝塞尔曲线作为控制点。(mX, mY)(x, y)(mX, mY)

我不是贝塞尔曲线的专家,但由于控制点与起点和终点共线,这看起来应该只是画一条直线,这意味着我们不妨直接调用Path.lineTo。此外,当我运行应用程序并移动指针时,会一直画一条线到新位置,而不是我对代码的预期一半。(x + mX)/2将and替换(y + mY)/2xandy或替换quadTolineTo不会产生明显的行为差异。

任何人都可以帮助解决我的困惑吗?

标签: androidandroid-canvasandroid-view

解决方案


我有完全相同的问题。在玩了一下参数值之后,我的理解是:

  1. 将控制点坐标设置为与起点坐标相同有助于绘制更平滑的曲线。

此外,当我运行应用程序并移动指针时,一条线一直绘制到新位置,而不是我对代码的预期的一半

发生的情况是,每次绘制新路径时,都会以像素为单位计算起点和终点之间的距离。对于每一个微小的移动,都会绘制一条新路径。所以,最后我们有很多小路一个接一个地画出来。你是正确的,路径(线,曲线)似乎一直画到最后,而不仅仅是中途。然而,实际发生的是,它确实画到了一半;每条新路径之间的距离是如此之小,以至于我们没有注意到这一点。让我用下面的屏幕截图来解释这一点。在这两种情况下,我都尝试从屏幕的一侧绘制到另一侧。

这是使用示例代码中给出的坐标时的外观 使用示例代码中给出的坐标绘制的路径

这就是如果我们在 quadTo() 中使用终点坐标作为实际终点坐标时的样子

使用与终点匹配的坐标绘制的路径

因此,当我们使用实际的终点坐标时,路径在终点位置方面更加准确(注意右侧的终点如何更接近第二张照片中的屏幕末端?)

另一方面,起点、控制点和终点之间的距离会影响路径的平滑度。在第二个屏幕截图中,我使用中间点作为控制点,这导致路径不太平滑。

至少我是这么理解的。如果有人有更准确的解释,请分享。


推荐阅读