1.差值器TimeInterpolator
从名字上可以看出,这个是跟时间有关的,差值器只是能修改速率的一种东西。
比如,匀速,快到慢,慢到快,快慢快或者慢快慢。
安卓本身提供给我们两个内置的差值器
1.匀速插值器:LinearInterpolator
2.先加速再减速 插值器:AccelerateDecelerateInterpolator
自定义差值器
public class DecelerateAccelerateInterpolator implements TimeInterpolator {
@Override
public float getInterpolation(float input) {
float result;
if (input <= 0.5) {
result = (float) (Math.sin(Math.PI * input)) / 2;
// 使用正弦函数来实现先减速后加速的功能,逻辑如下:
// 因为正弦函数初始弧度变化值非常大,刚好和余弦函数是相反的
// 随着弧度的增加,正弦函数的变化值也会逐渐变小,这样也就实现了减速的效果。
// 当弧度大于π/2之后,整个过程相反了过来,现在正弦函数的弧度变化值非常小,渐渐随着弧度继续增加,变化值越来越大,弧度到π时结束,这样从0过度到π,也就实现了先减速后加速的效果
} else {
result = (float) (2 - Math.sin(Math.PI * input)) / 2;
}
return result;
// 返回的result值 = 随着动画进度呈先减速后加速的变化趋势
}
mButton = (Button) findViewById(R.id.Button);
// 创建动画作用对象:此处以Button为例
float curTranslationX = mButton.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX);
// 创建动画对象 & 设置动画
// 表示的是:
// 动画作用对象是mButton
// 动画作用的对象的属性是X轴平移
// 动画效果是:从当前位置平移到 x=1500 再平移到初始位置
animator.setDuration(5000);
animator.setInterpolator(new DecelerateAccelerateInterpolator());
2.估值器TypeEvaluator
设置 属性值 从初始值过渡到结束值 的变化具体数值
插值器(Interpolator)决定值的变化规律(匀速、加速blabla),即决定的是变化趋势;而接下来的具体变化数值则交给估值器
系统内置的估值器有3个:
IntEvaluator:以整型的形式从初始值 - 结束值 进行过渡
FloatEvaluator:以浮点型的形式从初始值 - 结束值 进行过渡
ArgbEvaluator:以Argb类型的形式从初始值 - 结束值 进行过渡
自定义估值器
class PoinSinEvaluator implements TypeEvaluator{
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
Point startPoint= (Point) startValue;
Point endPoint= (Point) endValue;
int x= (int) (startPoint.x+fraction*(endPoint.x-startPoint.x));
int y= (int) ((Math.sin(x * Math.PI / 180) * 100)+endPoint.y / 2);
return new Point(x,y);
}
}
Point startPoint=new Point(RADU,RADU);
Point endP=new Point(getWidth()-RADU,getHeight()-RADU);
final ValueAnimator animator=ValueAnimator.ofObject(new PoinSinEvaluator(),startPoint,endP);
animator.setRepeatCount(-1);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint= (Point) animation.getAnimatedValue();
postInvalidate();
}
});