android - Android fingerpaint 示例中的 quadTo

标签 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”运动事件中, View 使用 Path.quadTo 方法在 Canvas 上绘制一个新的路径段。这个发生在104行,如果我没理解错的话,Path的当前位置是(mX, mY),而(x, y)就是用户所处的位置将指针移动到。所以 quadTo(mX, mY, (x + mX)/2, (y + mY)/2) 应该从 (mX, mY), < em>到 (x, y) 的一半,使用 (mX, mY) 作为控制点。

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

有谁能帮我解惑吗?

最佳答案

我有完全相同的问题。在对参数值进行了一些尝试之后,我的理解是:

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

Moreover, when I run the app and move the pointer, a line is drawn all the way to the new location, not just halfway as I would have expected from the code

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

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

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

Paths drawn with coordinates matching the end point

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

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

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

关于android - Android fingerpaint 示例中的 quadTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51506830/

相关文章:

Android - 相机作为运动检测器

android - android中的 Canvas 在不同设备上是成比例的

android - LinearLayout 不渲染

Android Studio 不显示我的真实设备来调试应用程序

android - 中止 SAX 解析中间文档?

android - 如何加快我的Android-openCV应用程序的速度?

android - 单击 View 应在其 Canvas 上重绘

java - Android 自定义 View 未绘制且 Canvas 最大尺寸

android - 何时附加和分离 View ?

android - 如何制作橱窗纯色背景