研究一下贝塞尔曲线.
/**
* 贝塞尔方程
*/
private class BeizerEvaluator implements TypeEvaluator<PointF> {
private PointF point1;
private PointF point2;
private PointF pointF;
public BeizerEvaluator(PointF point1, PointF point2) {
this.point1 = point1;
this.point2 = point2;
}
@Override
public PointF evaluate(float time, PointF start, PointF end) {
float timeLeft = 1.0f - time;
pointF = new PointF();//结果
PointF point0 = start;//起点
PointF point3 = end;//终点
pointF.x = timeLeft * timeLeft * timeLeft * (point0.x)
+ 3 * timeLeft * timeLeft * time * (point1.x)
+ 3 * timeLeft * time * time * (point2.x)
+ time * time * time * (point3.x);
pointF.y = timeLeft * timeLeft * timeLeft * (point0.y)
+ 3 * timeLeft * timeLeft * time * (point1.y)
+ 3 * timeLeft * time * time * (point2.y)
+ time * time * time * (point3.y);
return pointF;
}
}
//初始化一个BezierEvaluator
BeizerEvaluator evaluator = new BeizerEvaluator(getPointF(1), getPointF(2));
ValueAnimator animator = ValueAnimator.ofObject(evaluator, new PointF(rand.nextInt(getWidth()), 0), new PointF(rand.nextInt(getWidth()), mHeight - dHeight));//随机
animator.addUpdateListener(new BezierListenr(tag));
animator.setInterpolator(interpolators[rand.nextInt(3)]);
animator.setTarget(tag);
animator.setDuration(3000);
然后在需要更新的时候去Update设置imageVIew的路径:
private class BezierListenr implements ValueAnimator.AnimatorUpdateListener {
private View target;
public BezierListenr(View target) {
this.target = target;
}
@Override
public void onAnimationUpdate(ValueAnimator animation) {
PointF pointF = (PointF) animation.getAnimatedValue();
ViewHelper.setX(target, pointF.x);
ViewHelper.setY(target, pointF.y);
ViewHelper.setAlpha(target, 1 - animation.getAnimatedFraction());
}
}
GitHub:https://github.com/q422013/BezierFlower