创建动画对象,添加类型估值算法
在这里定义动画执行过程中每一刻返回的坐标信息
PointF startValue = new PointF(100,100);
PointF endValue = new PointF(300,300);
ValueAnimator va = ValueAnimator.ofObject(new TypeEvaluator<PointF>() {
@Override
public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
//fraction = 开始动画 0 ~ 结束动画 1
PointF outPutPointF = new PointF();
//region 根据运动时长返回不同坐标,进而影响后续更新的坐标值 【这里只是随便赋值,需要完成曲线动画的可以在赋值过程中添加三角函数等二维曲线算法计算坐标点,从而影响动画的效果】
//在 3/10 的运动时间段内
if (fraction < 0.3) {
outPutPointF = new PointF((float) 0.3 * startValue.x * fraction, (float) 0.3 * startValue.y * fraction);
}
// 在 3/10 ~ 6/10 的运动时间段内
if (fraction >= 0.3 && fraction < 0.6) {
outPutPointF = new PointF((float) 0.6 * startValue.x * fraction, (float) 0.6 * startValue.y * fraction);
}
// 在 6/10 以后的运动时间段内
if (fraction >= 0.6) {
outPutPointF = new PointF((float) 1 * endValue.x * fraction, (float) 1 * endValue.y * fraction);
}
//endregion
return outPutPointF;
}
},startValue,endValue);
添加动画执行过程的操作
在这里修改view组件的布局信息,达到view的动画效果
RelativeLayout.LayoutParams lp = new LayoutParams(150, 150);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//这里得到的对象就是我们在上面吐出的outPutPointF
PointF pointF = (PointF) animation.getAnimatedValue();
//根据每刻得到的坐标值,来规划面板
lp.setMargins((int) pointF.x, (int) pointF.y, 0, 0);
//每一刻的重设view组件的位置,形成点到线的动画效果
view.setLayoutParams(lp);
}
});
启动动画
//设置动画时长为3秒
va.setDuration(3000);
//启动动画
va.start();