我对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)/2
和x
或用y
替换quadTo
不会在行为上产生明显的差异。 / p>
任何人都可以帮助解决我的困惑吗?
答案 0 :(得分:0)
我有完全相同的问题。稍微玩弄参数值后,我的理解是:
此外,当我运行应用程序并移动指针时,会一直画一条线到新位置,而不是我从代码中预期的一半
发生的情况是,每次绘制新路径时,起点和终点之间的距离都以像素为单位计算。每次轻微移动都会绘制一条新路径。所以,最后我们有许多一条接一条的小路径。你是正确的,路径(线,曲线)似乎一直画到最后,而不是只画了一半。然而,实际上发生的是它确实被画了一半;每条新路径之间的距离非常小,以至于我们没有注意到。让我用下面的屏幕截图来解释这一点。在这两种情况下,我都尝试从屏幕的一侧绘制到另一侧。
这就是如果我们在 quadTo() 中使用终点坐标作为实际终点坐标的样子
所以,当我们使用实际的终点坐标时,路径在终点在哪里方面更准确(注意第二张照片中右边的终点如何更接近屏幕的末端?)< /p>
另一方面,起点、控制点和终点之间的距离影响路径的平滑度。在第二个屏幕截图中,我使用中间点作为控制点,这导致路径不太平滑。
至少我是这么理解的。如果有人有更准确的解释,请分享。