android - 安卓指纹示例中的 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)/2
为x
andy
或替换quadTo
为lineTo
不会产生明显的行为差异。
任何人都可以帮助解决我的困惑吗?
解决方案
我有完全相同的问题。在玩了一下参数值之后,我的理解是:
- 将控制点坐标设置为与起点坐标相同有助于绘制更平滑的曲线。
此外,当我运行应用程序并移动指针时,一条线一直绘制到新位置,而不是我对代码的预期的一半
发生的情况是,每次绘制新路径时,都会以像素为单位计算起点和终点之间的距离。对于每一个微小的移动,都会绘制一条新路径。所以,最后我们有很多小路一个接一个地画出来。你是正确的,路径(线,曲线)似乎一直画到最后,而不仅仅是中途。然而,实际发生的是,它确实画到了一半;每条新路径之间的距离是如此之小,以至于我们没有注意到这一点。让我用下面的屏幕截图来解释这一点。在这两种情况下,我都尝试从屏幕的一侧绘制到另一侧。
这就是如果我们在 quadTo() 中使用终点坐标作为实际终点坐标时的样子
因此,当我们使用实际的终点坐标时,路径在终点位置方面更加准确(注意右侧的终点如何更接近第二张照片中的屏幕末端?)
另一方面,起点、控制点和终点之间的距离会影响路径的平滑度。在第二个屏幕截图中,我使用中间点作为控制点,这导致路径不太平滑。
至少我是这么理解的。如果有人有更准确的解释,请分享。
推荐阅读
- spring - 为什么测试类没有使用 spring boot 2.5.5 设置 ActiveProfiles?
- agda - 为什么 Agda 在这里需要模式匹配
- ios - AVVideoCompositionCoreAnimationTool 在使用 AVAssetExportSession 导出期间没有为自定义属性设置动画
- arrays - 更改 Mui-datatable 的数据时收到错误:对象作为 React 子项无效(找到:带有键 {} 的对象)。如果你打算渲染一个
- github - 我可以使用 Github Actions 在同一组织的仓库中更新另一个提交的仓库吗?或者在 GH Pages 中显示内容而不提交它们?
- docker - 在远程 Docker 容器中开发时使用本地 Clang 格式
- git - Git:在以前的提交中删除旧模式 100644 新模式 100755
- makefile - 并行运行两个 make phony 目标
- html - 使用渐变时,在不同分辨率的元素中间会出现一个垂直的黑条
- spring-boot - 云原生应用程序的分布式跟踪