我在 canvas
中有一条贝塞尔曲线路径,从 (0,0)
开始,以 (canvasWidth,0)
结束,并带有控制点位于(canvasWidth,canvasHeight)
它的绘制正确,我得到了一条曲线。我使用 path.quadTo
方法绘制它,如下所示
path.moveTo(mPointStart.x, mPointStart.y);
path.quadTo(mControlPoint.x, mControlPoint.y, mPointEnd.x, mPointEnd.y);
canvas.drawPath(path, paint);
现在,我想在这个现有路径上绘制一个子路径。假设我想画一半的路径,
我想使用其他油漆重绘相同的路径直到一半,这样路径的一半将是一种颜色,另一半将是旧颜色。如何找到现有路径一半之前的点?
最佳答案
好的,我这样做的方法(在 Kotlin 中)是使用 PathMeasure 类。它看起来不是最好的,但它确实有效!因此,请发布任何更简洁的答案。
private fun getSubPath(path: Path, start: Float, end: Float): Path {
val pathMeasure = PathMeasure(path, false)
val point = FloatArray(2)
val subPath = Path()
var startFound = false
var startDistance = start
var endDistance = end
while (pathMeasure.nextContour()) {
val length = pathMeasure.length
startDistance -= length
endDistance -= length
if (!startFound) {
if (startDistance <= 0) {
startFound = true
val startPoint = length + startDistance
pathMeasure.getPosTan(startPoint, point, null)
subPath.moveTo(point[0], point[1])
if (startDistance < 0) {
val endPoint = length + endDistance
pathMeasure.getPosTan(endPoint, point, null)
subPath.lineTo(point[0], point[1])
if (endDistance <= 0) {
break
}
}
}
} else {
val endPoint = length + endDistance
pathMeasure.getPosTan(endPoint, point, null)
subPath.lineTo(point[0], point[1])
if (endDistance <= 0) {
break
}
}
}
return subPath
}
参数start
和end
不能小于0或大于路径的总长度。
使用方法如下:
private fun usePathFunction() {
val start = pathsTotalLength * 0.25
val end = pathsTotalLength * 0.75
val subPath = getSubPath(path, start, end)
}
关于Android canvas,如何从现有路径中获取子路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47974958/