欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

绘制系列(十)-属性动画之—AniamtorSet(组合动画)

程序员文章站 2022-05-03 10:33:18
...

属性动画之—组合动画(AnimatorSet)

前面我们说过借助PropertyValuesHolder,也可以实现多个动画同时作用于同一控件,AnimatorSet为官方给出的组合实现。
首先明确的一点是,组合动画对ValueAniamtor和ObjectAnimator都适用,但是一般ObjectAniamtor组合动画最常用。直接给为我们提供了两个方法playSequentially和playTogether,playSequentially表示所有动画依次播放,playTogether表示所有动画一起开始。

AnimatorSet.Builder

比如我们有三个动画,需要先播放动画C,在同播放动画A、B,这playsequentially()和playTogether()就无法实现了。就需要借助AnimatorSet.Builder类实现了

生成Animator.Builder对象实例,是通果animatorSet.play(animtor)方法生成对象的,表示要播放那个动画。

再来看看Animator.Builder类其方法

	
	//和前面动画一起执行
	public Builder with(Animator anim)

	//执行先执行这个动画,再执行前面动画
	public Builder before(Animator anim)

	
	//执行前面的动画后,才执行该动画	
	public Builder after(Animator anim)

	//延迟n毫秒之后执行动画
	public Builder after(long delay)


play()表示当前动画,before()、after()、with()都是以play()当前播放的那个动画为基准的
比如play(animA),表示当前正在播放animA,before(animB),表示在animA在animB前面播放,with(animC)表示animaA和animC同时播放,after(animD)表示animA在animD之后播放。因此播放顺序为:D——>A、C——>B

AnimatorSet监听器


	public static interface AnimatorListener {
	    /**
	     * 当AnimatorSet开始时调用
	     */
	    void onAnimationStart(Animator animation);
	
	    /**
	     * 当AnimatorSet结束时调用
	     */
	    void onAnimationEnd(Animator animation);
	
	    /**
	     * 当AnimatorSet被取消时调用
	     */
	    void onAnimationCancel(Animator animation);
	
	    /**
	     * 当AnimatorSet重复时调用,由于AnimatorSet没有设置repeat的函数,所以这个方法永远不会被调用
	     */
	    void onAnimationRepeat(Animator animation);
	}


这儿需要说明一点是,监听器监听的而是AniamtorSet本身的动作,而不是其内部每个动画的动作。只有当AnimatorSet状态飞改变时,才会被调用

最后在来看看AniamtorSet类中的其他几个方法


	//设置单次动画时长
	public AnimatorSet setDuration(long duration);
	//设置加速器
	public void setInterpolator(TimeInterpolator interpolator)
	//设置ObjectAnimator动画目标控件,如果设置了,会覆盖单个动画中的目标控件
	public void setTarget(Object target)


可能你会有这种疑问,AnimatorSet和其内部的动画设置插值器等有什么区别?

区别就是:在AnimatorSet中设置以后,会覆盖单个ObjectAnimator中的设置;即如果AnimatorSet中没有设置,那么就以ObjectAnimator中的设置为准。如果AnimatorSet中设置以后,ObjectAnimator中的设置就会无效。
比如内部每个单个动画设置了时长、插值器,而animatorSet也设置了时长没有设置插值器,animatorSet设置的时长会覆盖内部每个动画的时长,其时长全部变成animatorSet设置的时长,而内部动画还是按自己的插值器效果实现自己的动画。一旦animatorSet也设置了插值器,南无内部每个动画设置插值器就会无效,每个动画的插值器就变成了animatorSet设置的插值器了。