首先扯点别的:今天看了看十月一回家的火车票,只能说艰难,只剩下一张无座的票了,而且还是从下午一点到次日凌晨4点的慢车,太漫长了。难道临沂到上海就不能修一条高铁吗!看样这次得坐汽车了。
继续总结Android 属性动画的使用
经过前面的学习,我总结了,无论是使用ValueAnimator还是ObjectAnimator,它们之所以能够完成从初始状态到结束状态的过渡,是因为必须有一个继承自TypeEvaluator的一个evaluator。ofInt方法是内置的IntEvaluator,ofFloat方法是内置的FloatEvaluator,而我们使用ofObject方法的时候就得自定义一个继承自TypeEvaluator来完成动画的过渡。
这就好坐火车从菏泽(起点)去上海(终点),TypeEvaluator就好比是火车,可以让你在规定时间内到达上海。但是这个火车是怎么跑的就不知道了,它可能在一个站停的时间长一点,在另外一个站停的时间短一点。那么是什么控制火车的这些行为呢?就是接下来说的Interpolator。
Interpolator:翻译过来是差值器,可以把它想象为汽车上的档位,挂不同的档速度是不一样的,但是必须得保证在规定的时间内跑到终点
不同类型的差值器都间接实现TimeInterpolator接口,这个接口的定义是这样的:
//一个时间差值器决定动画的变化速率。使得动画可以做非线性运动,例如加速或者减速。
A time interpolator defines the rate of change of an animation. This
allows animations to have non-linear motion, such as acceleration and
deceleration.
一些系统定义好的Interpolator,系统默认的差值器是AccelerateDecelerateInterpolator。
// The time interpolator to be used if none is set on the animation
private static final TimeInterpolator sDefaultInterpolator =
new AccelerateDecelerateInterpolator();
举个例子来看看下面的差值器的效果,我想改变button的translationY属性,让button向下移动1200px
tY = button.getTranslationY();
o = ObjectAnimator.ofFloat(button, "translationY", tY, 1200);
//不断更换差值器的类型
o.setInterpolator(new AccelerateInterpolator());
o.setDuration(2000);
o.start();
//系统默认的方式,现加速后减速,动画在开始和结束的时候变化很慢,在中间阶段变化很快
AccelerateDecelerateInterpolator An interpolator where the rate of
change starts and ends slowly but accelerates through the middle.
//动画在开始的时候变化很慢,然后做加速运动
AccelerateInterpolator An interpolator where the rate of change starts
out slowly and and then accelerates.
//button会先向上移动一段距离,然后加速向下移动1200px
AnticipateInterpolator An interpolator where the change starts
backward then flings forward.
//button会先向上移动一段距离,然后加速向下,超过1200px的位置,然后最终停在1200px的
位置
AnticipateOvershootInterpolator An interpolator where the change starts
backward then flings forward and overshoots the target value and finally goes back to the final value.
//button 加速向下到达终点,然后弹起,落下,弹起,落下,最后停在终点
BounceInterpolator An interpolator where the change bounces at the
end.
//o.setInterpolator(new CycleInterpolator(2));button向下,向上(超过初始位
置),向下,再向上,然后回到原来的位置。
CycleInterpolator Repeats the animation for a specified number of
cycles.
//开始的时候变化很快,先后减速到达终点
DecelerateInterpolator An interpolator where the rate of change starts
out quickly and and then decelerates.
//加速很快,并一直保持加速直到终点
FastOutLinearInInterpolator Interpolator corresponding to
fast_out_linear_in.
//加速很快,但是减速很慢
FastOutSlowInInterpolator Interpolator corresponding to fast_out_slow_in.
//匀速直线运动
LinearInterpolator An interpolator where the rate of change is constant
//从最快的峰值速度逐渐减慢
LinearOutSlowInInterpolator Interpolator corresponding to linear_out_slow_in.
//加速超过终点,然后回到终点
OvershootInterpolator An interpolator where the change flings forward
and overshoots the last value then comes back.
//这个没有试
PathInterpolator An interpolator that can traverse a Path that extends
from Point (0, 0) to (1, 1).
如果想要实现自己的动画速率变换方式,可以自定义差值器
public class MyTimeInterpolator implements TimeInterpolator {
@Override
public float getInterpolation(float input) {
float result;
//intput值[0,1]
if (input <= 0.5) {
result = (float) (Math.sin(Math.PI * input)) / 2;
} else {
result = (float) (2 - Math.sin(Math.PI * input)) / 2;
}
return result;
}
}
//使用自定义的差值器
anim.setInterpolator(new MyTimeInterpolator ());
1 改变透明度
button.animate()
.alpha(0)
.setDuration(2000)
.start();
2 组合动画
button1.animate()
.scaleX(0.5f)
.alpha(0.5f)
.setDuration(3000)
.setInterpolator(new LinearInterpolator()).start();
参考链接:
结尾:该吃中午饭了。昨天发现一个很有趣的事情,我经常在家里说‘艰难’两个字,结果跟我合租房子的一个姐也学会了说这两个字,哈哈,当时就感觉到英吹思婷了!