Android canvas,如何从现有路径中获取子路径?

标签 android canvas android-canvas

我在 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
}

参数startend不能小于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/

相关文章:

javascript - jQuery animate 在 Canvas 上移动文本

android - android 一起使用 scrollview 和 adjustPan

android - Rxjava : Insert only works with single but not with completable

canvas - Tkinter 创建图像函数错误(pyimage1 不存在)

actionscript-3 - 游戏开发中的 HTML 与 ActionScript3?

java - 绘制属性在应用两次时不起作用

android - 抽屉导航未从方法 DrawerLayout.openDrawer(GravityCompat.START) 的左侧打开

android - 所选设备不兼容 - Android Studio

android - 如何将动态 alpha 蒙版应用于 Android 上的文本

Android - 在 Canvas 上定位位图因设备而异。如何处理?