Android Fingerpaint示例中的quadTo

时间:2018-07-24 20:14:01

标签: android android-canvas android-view

我对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行。如果我正确理解,则Path的当前位置为(mX, mY),而(x, y)是用户将指针移至的位置。因此,quadTo(mX, mY, (x + mX)/2, (y + mY)/2)应该使用(mX, mY)作为控制点,从(x, y)中途(mX, mY)绘制二次贝塞尔曲线。

我不是贝塞尔曲线方面的专家,但是由于控制点与起点和终点共线,因此看起来它应该画一条直线,这意味着我们也可能刚刚将{{1}称为}。而且,当我运行应用程序并移动指针时,会一直画一条线到新位置,而不仅仅是我从代码中所期望的一半。用Path.lineTo(x + mX)/2替换(y + mY)/2x或用y替换quadTo不会在行为上产生明显的差异。 / p>

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

1 个答案:

答案 0 :(得分:0)

我有完全相同的问题。稍微玩弄参数值后,我的理解是:

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

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

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

这是使用示例代码中给出的坐标时的样子 Paths drawn with coordinates as given in the example code

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

Paths drawn with coordinates matching the end point

所以,当我们使用实际的终点坐标时,路径在终点在哪里方面更准确(注意第二张照片中右边的终点如何更接近屏幕的末端?)< /p>

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

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