content: package com.hx.curtain.drawer;
  
  import android.graphics.Path;
  import android.graphics.PathMeasure;
  import android.graphics.Point;
  
  import java.util.List;
  
  public class BezierUtils {
      private static final float SMOOTH = 0.3f;
  
      public static void measurePath(PathMeasure pathMeasure, List<Point> mPointList) {
          Path mPath = new Path();
          float prePreviousPointX = Float.NaN;
          float prePreviousPointY = Float.NaN;
          float previousPointX = Float.NaN;
          float previousPointY = Float.NaN;
          float currentPointX = Float.NaN;
          float currentPointY = Float.NaN;
          float nextPointX;
          float nextPointY;
  
          final int lineSize = mPointList.size();
          for (int valueIndex = 0; valueIndex < lineSize; ++valueIndex) {
              if (Float.isNaN(currentPointX)) {
                  Point point = mPointList.get(valueIndex);
                  currentPointX = point.x;
                  currentPointY = point.y;
              }
              if (Float.isNaN(previousPointX)) {
                  //是否是第一个点
                  if (valueIndex > 0) {
                      Point point = mPointList.get(valueIndex - 1);
                      previousPointX = point.x;
                      previousPointY = point.y;
                  } else {
                      //是的话就用当前点表示上一个点
                      previousPointX = currentPointX;
                      previousPointY = currentPointY;
                  }
              }
  
              if (Float.isNaN(prePreviousPointX)) {
                  //是否是前两个点
                  if (valueIndex > 1) {
                      Point point = mPointList.get(valueIndex - 2);
                      prePreviousPointX = point.x;
                      prePreviousPointY = point.y;
                  } else {
                      //是的话就用当前点表示上上个点
                      prePreviousPointX = previousPointX;
                      prePreviousPointY = previousPointY;
                  }
              }
  
              // 判断是不是最后一个点了
              if (valueIndex < lineSize - 1) {
                  Point point = mPointList.get(valueIndex + 1);
                  nextPointX = point.x;
                  nextPointY = point.y;
              } else {
                  //是的话就用当前点表示下一个点
                  nextPointX = currentPointX;
                  nextPointY = currentPointY;
              }
  
              if (valueIndex == 0) {
                  // 将Path移动到开始点
                  mPath.moveTo(currentPointX, currentPointY);
              } else {
                  // 求出控制点坐标
                  final float firstDiffX = (currentPointX - prePreviousPointX);
                  final float firstDiffY = (currentPointY - prePreviousPointY);
                  final float secondDiffX = (nextPointX - previousPointX);
                  final float secondDiffY = (nextPointY - previousPointY);
                  final float firstControlPointX = previousPointX + (SMOOTH * firstDiffX);
                  final float firstControlPointY = previousPointY + (SMOOTH * firstDiffY);
                  final float secondControlPointX = currentPointX - (SMOOTH * secondDiffX);
                  final float secondControlPointY = currentPointY - (SMOOTH * secondDiffY);
                  //画出曲线
                  mPath.cubicTo(firstControlPointX, firstControlPointY, secondControlPointX, secondControlPointY,
                          currentPointX, currentPointY);
              }
  
              // 更新值,
              prePreviousPointX = previousPointX;
              prePreviousPointY = previousPointY;
              previousPointX = currentPointX;
              previousPointY = currentPointY;
              currentPointX = nextPointX;
              currentPointY = nextPointY;
          }
          pathMeasure.setPath(mPath, false);
      }
  
  }
  