1.效果展示
2.实现步骤
public PathMeasureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//1.关闭硬件加速(否则有问题)
setLayerType(LAYER_TYPE_SOFTWARE, null);
paint = new Paint();
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
origPath = new Path();
//2.添加圆形(原点选择成0,0. onDraw() 我会移动canvas,将坐标中点移动到屏幕中点)
origPath.addCircle(0, 0, 300, Path.Direction.CW);
//3.画对号
origPath.moveTo(-150, 0);
origPath.lineTo(0, 150);
origPath.lineTo(150, -200);
//4.创建PathMeasure
pathMeasure = new PathMeasure(origPath, false);
dst = new Path();
//5设置属性动画 (0~1)圆形path动画 1 切换到第二条path (1~2) 对号path动画
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 2)
.setDuration(10000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
animatorValues1 = (float) animation.getAnimatedValue();
postInvalidate();
}
});
valueAnimator.start();
}
PathMeasure 了解可以移步 这篇
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
this.mWidth = w;
this.mHeight = h;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//移动画布
canvas.translate(mWidth / 2, mHeight / 2);
//距离起点的距离
float stopD = 0;
if (animatorValues1 < 1) {
stopD = pathMeasure.getLength() * animatorValues1;
boolean segment = pathMeasure.getSegment(0, stopD, dst, true);
} else if (animatorValues1 == 1) {
pathMeasure.getSegment(0, pathMeasure.getLength(), dst, true);
//切换到下一个path
pathMeasure.nextContour();
} else {
stopD = pathMeasure.getLength() * Math.abs(1 - animatorValues1);
boolean segment = pathMeasure.getSegment(0, stopD, dst, true);
}
canvas.drawPath(dst, paint);
}