Android N阶贝塞尔曲线路径计算

演示效果

  • N阶贝塞尔曲线效果

  • 应用场景:点赞之后心形漂浮

关键代码

NOrderBezierView.javabuildDotPosition方法:

    /**
     * @param i 贝塞尔曲线路径中的第几个点
     * @return 计算得到的所有点
     */
    private ArrayList<ArrayList<PointF>> buildDotPosition(float i) {
        // 保存全部点的数组
        ArrayList<ArrayList<PointF>> allDotPosition = new ArrayList<>();
        // 当前层计算结果
        ArrayList<PointF> rowPosition;
        // 把控制点添加到全部点的数组中
        allDotPosition.add(mControlDots);
        // 控制点的数量就是我们要计算的轮数
        int size = mControlDots.size();
        for (int j = 0; j < size; j++) {
            // 取得上轮计算的结果
            ArrayList<PointF> jPointFs = allDotPosition.get(j);
            // 创建当前轮计算结果的保存数组
            rowPosition = new ArrayList<>();
            // 遍历上轮结果
            for (int k = 0; k < jPointFs.size(); k++) {
                if (k != 0) {
                    // 通过上轮相邻点计算本轮新的点
                    float x = jPointFs.get(k).x;
                    float y = jPointFs.get(k).y;
                    float x1 = jPointFs.get(k - 1).x;
                    float y1 = jPointFs.get(k - 1).y;
                    float xOffset = Math.abs(x1 - x) * 1.0f * i / SAMPLING;
                    float yOffset = Math.abs(y1 - y) * 1.0f * i / SAMPLING;
                    float x2;
                    float y2;
                    if (x > x1) {
                        x2 = x1 + xOffset;
                    } else {
                        x2 = x1 - xOffset;
                    }
                    if (y > y1) {
                        y2 = y1 + yOffset;
                    } else {
                        y2 = y1 - yOffset;
                    }
                    // 计算结果保存到数组
                    rowPosition.add(new PointF(x2, y2));
                }
            }
            if (rowPosition.size() != 0) {
                // 本轮计算结果添加到全部点的数组中
                allDotPosition.add(rowPosition);
            }
        }
        return allDotPosition;
    }

Github