Android 动画之AnimatorSet
来源:互联网 发布:九宫图算法计算器 编辑:程序博客网 时间:2024/05/29 17:10
Android动画系列:
- Android之补间动画详解
- Android 动画之帧动画
- Android 动画之LayoutAnimation
- Android 动画之属性动画(一)
- Android 动画之属性动画(二)
- Android 动画之属性动画(三)
- Android 动画之属性动画(四)
- Android 动画之LayoutTransition
- Android 动画之AnimatorSet
介绍
在Android系统里只允许对View设置有且仅有一个动画效果,不能够为同时给View设置多个动画。即使有一系列的动画,也只能允许一个动画执行,一个动画结束后在开始另外一个外一个动画。AnimatorSet是一个集合动画,允许对控件设置一系列的动画。在AnimatorSet里可以指定动画的播放顺序、是否一起播放或者是否延迟播放。
向AnimatorSet添加动画有两种不同的方法,其一是调用playTogether()或playSequentially()方法来一次性添加一组动画,其二是播放(Animator)可以与Builder类一个一个添加动画。
注:在添加系列动画时,一定要考虑到同时执行的动画之间是否会出现冲突。比如添加的动画且同时执行的,一个向左移动,另外一个向右移动,此时Android系统必然不知道如何处理,这种小失误应该是规避的。
AnimatorSet.Builder
AnimatorSet.Builder是一个使用的动画工具类,用于方便向AnimatorSet添加动画以及设置各种动画之间的关系。在AnimatorSet.Builder中,共声明了after(long)、after(Animator)、before(Animator)、with(Animator)等四个方法。
- after(delay):设置动画延迟delay时间后播放
- after(anim):设置在anim动画结束后播放此动画
- before(anim):设置此动画早于anim播放
- with(anim):设置此冬雨与anim一起播放
与playTogether()和playSequentially()方法想比较,采用AnimatorSet.Builder向AnimatorSet逐一添加动画,更能准确的知道动画的播放顺序。
AnimatorSet bouncer = new AnimatorSet();bouncer.play(bounceAnim).before(squashAnim1);bouncer.play(squashAnim1).with(squashAnim2);bouncer.play(squashAnim1).with(stretchAnim1);bouncer.play(squashAnim1).with(stretchAnim2);bouncer.play(bounceBackAnim).after(stretchAnim2);ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);fadeAnim.setDuration(250);AnimatorSet animatorSet = new AnimatorSet();animatorSet.play(bouncer).before(fadeAnim);animatorSet.start();
分析上述代码中的一系列动画的播放顺序如下:
执行bouncer
- bounceAnim
- squashAnim1与squashAnim2、stretchAnim1、stretchAnim2一起执行
- bounceBackAnim
执行fadeAnim
注:AnimatorSet.Builder的构造方法并未对外公布,如果想创建其实例,只能通过调用play(Animator)。
常用API
play(Animator anim):添加一个动画,并返回AnimatorSet.Builder
playSequentially(List items):添加一组动画,播放顺序为一一播放
playSequentially(Animator… items):添加一组动画,播放顺序为一一播放
playTogether(Collection items):添加一组动画,播放顺序为一起播放
playTogether(Animator… items):添加一组动画,播放顺序为一起播放
动画实例
play
AnimatorSet bouncer = new AnimatorSet();// 右移300fObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 0f, 300f);// 下移300fObjectAnimator objectAnimatorB = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_Y, 0f, 300f);// 从右边300f左移至原位置ObjectAnimator objectAnimatorC = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 300f, 0f);// 旋转360度ObjectAnimator objectAnimatorD = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_ROTATION, 0f, 360f);bouncer.play(objectAnimatorA).before(objectAnimatorB);bouncer.play(objectAnimatorB).with(objectAnimatorD);bouncer.play(objectAnimatorC).after(objectAnimatorB);bouncer.setDuration(6000);bouncer.start();
分析代码中,动画的执行顺序分析如下:
1. objectAnimatorA早于objectAnimatorB执行
2. objectAnimatorB与objectAnimatorD一起执行
3. objectAnimatorC晚于objectAnimatorB
故而bouncer优先执行objectAnimatorA,然后执行objectAnimatorB与objectAnimatorD的混合动画,最后执行objectAnimatorC。
playSequentially
AnimatorSet bouncer = new AnimatorSet();ObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 0f, 300f);ObjectAnimator objectAnimatorB = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_Y, 0f, 300f);ObjectAnimator objectAnimatorC = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_ROTATION, 0f, 360f);bouncer.playSequentially(objectAnimatorA, objectAnimatorB, objectAnimatorC);bouncer.setDuration(6000);bouncer.start();
向bouncer通过playSequentially()将objectAnimatorA、objectAnimatorB及objectAnimatorC,其播放顺序为一一播放。
playTogether
AnimatorSet bouncer = new AnimatorSet();ObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 0f, 300f);ObjectAnimator objectAnimatorB = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_Y, 0f, 300f);ObjectAnimator objectAnimatorC = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_ROTATION, 0f, 360f);bouncer.playTogether(objectAnimatorA, objectAnimatorB, objectAnimatorC); bouncer.setDuration(6000); bouncer.start();
向bouncer通过playTogether()将objectAnimatorA、objectAnimatorB及objectAnimatorC,其播放顺序为一起播放。
- Android 动画之AnimatorSet
- Android 动画之集合动画AnimatorSet
- Android动画之AnimatorSet如何循环执行
- Android属性动画之ObjectAnimator和AnimatorSet
- Android属性动画之ObjectAnimator和AnimatorSet
- Android动画-属性动画-AnimatorSet
- android 动画AnimationSet 和 AnimatorSet
- android 动画AnimationSet 和 AnimatorSet
- 动画AnimatorSet
- android 属性动画 AnimatorSet的使用
- Android-Animator属性动画( ObjectAnimator , AnimatorSet , ValueAnimator )
- Android属性动画(ObjectAnimator、PropertyValuesHolder、ValueAnimator、AnimatorSet)
- Android属性动画AnimatorSet源码简单分析
- Android 属性动画,Animator,ValueAnimator,ObjectAnimator, AnimatorSet
- 动画[5]PropertyAnimator AnimatorSet
- Android中的属性动画(一般属性动画,组合属性动画,AnimatorSet,动画监听)
- Android自定义控件:动画类(十)----AnimatorSet联合动画的代码实现
- 一个类学习android基础动画类(ObjectAnimator和AnimatorSet和ValueAnimator)
- KMP原理及使用的再总结
- hadoop组件书籍列表
- Android沉浸式——更改状态栏背景色
- 记(java数据结构与算法之顺序表与链表深入分析)
- pip memoryerror & oserror
- Android 动画之AnimatorSet
- unable to dequeue a cell with identifier xxx - must register a nib or a class fo
- android studio 手动更新gradle的方法
- iOS自定义相机实现拍照和连拍
- ubuntu搭建记录
- sum在matlab中的用法
- 使用Spring Session做分布式会话管理
- 跟QQ类似的本地相册多选功能,并在列表中提示已选图片数量
- 使用Android Studio阅读整个Android源码