【参考链接】
TweenAnimation虽然提供了各种不同的动画,但是也具有一些相同的方法
setDuration()
持续时间
setFillAfter()
动画结束时View是否停留在结束位置,true表示停在false表示不。
setRepeatCount()
重复次数,如果-1则无限循环
setRepeatMode()
设置为Animation.RESTART则从头开始重复,设置为Animation.REVERSE则倒着开始重复
setInterpolator()
设置插值器
setStartOffset()
设置每次动画开始时的延时时间,设置后每次重复时也有延时
ta.setStartOffset(1000);
不过实际显示效果是,会先移动到动画的起始位置,等延时时间过了以后再开始动画
start()
startNow()
setStartTime()
这3个函数其实都是调用的setStartTime()方法
它并没有真正/立即开始动画,只是设置了状态位,需要我们自己触发重绘
当下次重绘的时候,判断当前时间超出了startTime,才会设置mStarted=true,并且将当前时间+duration设置为结束时间,开始动画。
通过如下方式来使用(功能同View.startAnimation())
public void
translate(View view) {
TranslateAnimation ta= new
TranslateAnimation(
Animation.ABSOLUTE,
0,
Animation.RELATIVE_TO_SELF,
0f,
Animation.RELATIVE_TO_PARENT,
0f,
Animation.RELATIVE_TO_PARENT,
0.5f);
ta.setDuration(2000);
ta.setRepeatCount(-1);
ta.setRepeatMode(Animation.REVERSE);
ta.setInterpolator(new
LinearInterpolator());
// ta.start();
// ta.startNow();
ta.setStartTime(AnimationUtils.currentAnimationTimeMillis());//这3个方法本质是一样的
iv.setAnimation(ta);
// iv.invalidate();
// invalidate()高低版本差异不一定会触发父ViewGroup派发
// 而TweenAnimanion是在父ViewGroup dispatchChild()时将Matrix应用到子View的画布上的//所以这个地方不能直接用invalidate()
((View)iv.getParent()).invalidate();
// iv.requestLayout();
// 当然用requestLayout()是可以的
}
cancel()
停止动画
setAnimationListener()
可以给动画添加监听,也是在注册观察者
可以设置onAnimationStart()、onAnimationEnd()、onAnimationRepeat()时的回调
ta.setAnimationListener(new
Animation.AnimationListener() {
@Override
public void
onAnimationStart(Animation animation) {
Log.e("shadowfaxghh",
"onAnimationStart");
}
@Override
public void
onAnimationEnd(Animation animation) {
Log.e("shadowfaxghh",
"onAnimationEnd");
}
@Override
public void
onAnimationRepeat(Animation animation) {
Log.e("shadowfaxghh",
"onAnimationRepeat");
}
});