演示效果
- N阶贝塞尔曲线效果
-
应用场景:点赞之后心形漂浮
关键代码
NOrderBezierView.java 中buildDotPosition
方法:
/**
* @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;
}