ActionAnimatorSet
一款强大的属性动画操作集合
在开发中经常会遇到,控制多个属性动画协同合作的这种需求,比如先调用动画A,再同时调用动画B和C;亦或是在A执行了一半的时候,再调用动画B之类的。Android的SDK提供了AnimationSet,可以操作多个动画的播放顺序。但ActionAnimatorSet提供了更加丰富的操作,譬如动画在执行了某一时刻触发另一个(组)动画。
##添加依赖
compile 'com.paulyung:actionanimatorset:1.1.1'
##效果演示
##与AnimatorSet相同点
提供playTogether()
同时执行多个动画和playSequence()
顺序执行多个动画两个方法
##与AnimatorSet异同点
- 1 封装了动画监听:
Animator.AnimatorListener
,不用单独再给属性动画设置监听器,直接用addStartAction(Animator anim, Action start)
和addEndAction(Animator anim, Action end)
可以监听动画执行前和动画执行后的动作,Action
代表了一个动作。 - 2 动画的精准控制:允许某个动画执行到某个点时,控制其它动画的开始
##如何获取ActionAnimatorSet
AnimatorManager manager = new DefaultAnimatorManager();
ActionAnimatorSet animSet = manager.createAnimatorSet();
##AnimatorManager 这是一个动画管理者,通过它创建动画集合ActionAnimatorSet
,同时它也管理独立的动画,并能够通过Tag来寻找相应的动画。同时也能为它设置监听器,监听动画开始和结束。
AnimatorManager manager = new DefaultAnimatorManager();
ObjectAnimator animA = ObjectAnimator.ofFloat(view1, "y", 1200);
manager.addAnimator(animA, "animA");
manager.setOnStartListener("animA", new Action() {
@Override
public void doAction() {
showToast("view1开始了");
}
});
manager.build();//必须调用,才能使上面功能生效
///
manager.start("animA")
##ActionAnimatorSet主要使用的方法
void playFirst(Animator... anims)//添加头,最先执行
void playTogether(Animator... anims)//同时执行,和playFirst作用是一样的
void playSequence(Animator... anims)//顺序执行
void addAnimWith(Animator A, Animator B)//将A添加进去,并和B同时开始播放,主要用作一些不是头部,又需要同时操作的动画
void addAnimAfter(Animator A, Animator B)//将A添加进去,并在B播放完之后,开始播放
void addAnimBetween(Animator A, Animator B, TriggerPoint startPoint)//将A添加进去,并定义了一个开始点TriggerPoint ,在B播放到这个点时,开始播放A
void addStartAction(Animator A, Action start);//给A动画添加动画开始时的监听
void addEndAction(Animator A, Action end);//给A动画添加动画结束时的监听
##添加动画的方式
在ActionAnimatorSet里面添加动画,需要添加一个头,然后依次添加动画和指明该动画所依赖的动画,如需精确控制开始点,还需参数指明。
###示例1(简单的同时执行) 先使用ObjectAnimatior
定义3个动画,A,B,C
ObjectAnimator A = ObjectAnimator.ofFloat(view1, "y", 1200);
ObjectAnimator B = ObjectAnimator.ofFloat(view2, "y", 1200);
ObjectAnimator C = ObjectAnimator.ofFloat(view3, "y", 1200);
然后使用ActionAnimatorSet
提供的playTogether()
方法或者playFirst()
将动画添加进ActionAnimatorSet
ActionAnimatorSet animSet = new ActionAnimatorSet();
animSet.playTogether(view1Anim, view2Anim, view3Anim);
animSet.start()//开始执行这个动画集合
###示例2(添加依赖) 现在让刚刚的动画A,B,C执行这样一个操作: A最先执行,等A执行完之后,B和C同时执行
animSet.playFirst(A);//A作为头,最先执行
animSet.addAnimAfter(B, A);//将B添加进ActionAnimatorSet,并在A播放完成之后执行
animSet.addAnimAfter(C, A);//将C添加进ActionAnimatorSet,并在A播放完成之后执行
animSet.start()//开始执行这个动画集合
以上方法调用顺序将不影响添加,可以先添加C再添加B,最后添加A也没问题,但是不可以重复添加。
###示例3(精准控制开始点) A先播放,B在A的值达到600的时候播放,C在B达到600时候播放
animSet.playFirst(A);//A作为头,最先执行
animSet.addAnimBetween(B, A, new TriggerPoint(600));
animSet.addAnimBetween(C, B, new TriggerPoint(600));
以上这个例子是动画的值为Float
的情况,如果值为Int
型也按照这种构造函数的方式传入开始点
###示例4(精准控制开始点,值为Object的时候) 现在A动画的值是一个叫做PointF
对象类型的,它的初始化如下
PointF startPoint = new PointF(100, 200);
PointF endPoint = new PointF(400, 500);
ObjectAnimator A = ObjectAnimator.ofObject(this, "Anim", new AnimEvaluator(), startPoint, endPoint);//因为我的set方法是放在Activity里面的,所以直接使用了this
B和C任然是Float型,这里省略初始化操作。 现在A的运行轨迹动画是从startPoint
到 endPoint
,当它的横坐标x
大于300的时候,我们同时执行B和C动画,代码如下:
animSet.playFirst(A);//A作为头,最先执行
animSet.addAnimBetween(B, A, new TriggerPoint<PointF>() {
@Override
public boolean whenToStart(PointF p) {
return p.x > 300;
}
});//添加B,在A动画的PointF的x大于300时执行动画
animSet.addAnimWith(C, B);//添加C,和B同时执行
##最大特色
TriggerPoint定义了一个触发时刻点,允许用户定义该点来精确控制一组动画的执行时刻,并支持Object
类型的属性动画Vaule
-
1 当ObjectAnimator的Value为Int或者float类型时,直接通过构造函数传入参数,指定触发时刻 eg:
new TriggerPoint(0.3);
-
2 当ObjectAnimator的Value为某个对象时,创建
TriggerPoint
的时候需要重写whenToStart(T obj)
方法,在该方法内部定义如何触发动画,该方法返回一个boolean
值,当返回true
时,表示此时触发动画。此TriggerPoint
支持泛型操作,十分方便。
##最后 更多详情请看Sample项目