学习|Android属性动画的组合动画之一–AnimationSet

  • 2019 年 11 月 25 日
  • 筆記

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为2739,预计阅读7分钟

Android组合动画

上篇文章我们介绍了《学习|Android属性动画的基础介绍》,里面只做了一个简单的动画例子,其实真正使用的时候一般我们都是通过动画的多样组合进行播放的,本章就专门介绍一下Android中的动画组合之一AnimationSet的介绍。

动画组合的四种方式

AnimationSet和Animatorset

一般来说,Android实现动画组合有四种方式,分别是:

  • AnimationSet
  • AnimatorSet
  • PropertyValuesHolder
  • ViewPropertyAnimator

个人来说我用到的基本就前两种,所以也主要就介绍一下前两种。前两种的名称差不多,其实也是有其不同之处,这里简单介绍一下两个的不同点。

AnimationSet和Animatorset

数字1代表AnimationSet 数据2代表Animatorset

1

动画都是是同时执行

不支持背景色的修改

Animation 的子类

2

动画可以按先后顺序执行

支持背景色的修改

Animator 的子类

AnimationSet的使用

微卡智享

一般来我说我们在App中常用的都是一些视图动画:包括透明动画(AlphaAnimation)旋转动画(RotateAnimation)移动动画(TranslateAnimation)缩放动画(ScaleAnimation),我们用AnimationSet就可以把这些动画组合起来实现我们想要的效果。

我们通过定义上面那四种动画组合,再使用animationSet.addAnimation的函数把动画加进来即可实现该效果。下面是列出来AnimationSet的几个比较常用的函数方法:

函数名

参数

说明

构造函数

boolean interpolator

true:代表使用默认的interpolatorfalse:代表使用自定义interpolator

addAnimation

Animation a

添加定义好的动画效果

setDuration

long time

设置播放时长(毫秒)

setRepeatCount

int count

设置重放次数

setRepeatMode

int repeatmode

设置重放模式

setInterpolator

interpolator i

设置插值器

setFillAfter

boolean b

是否保持动画完成后的位置 ‍

setFillBefore

boolean b

是否保持动画开始时的状态 ‍

cancel

取消AnimationSet

reset

释放AnimationSet

划重点

上面的函数中setRepeatCount和setRepeatMode两个函数我用别的颜色标注了,主要是因为在使用的过程中发现不起作用,后来在网上找了找资料后发现在AnimationSet使用这个没有效果,需要在对应的Animaion的动画里面设置才行。

代码实现

微卡智享

我们在还是用上一章中那个Demo,新建一个AnimationScale的函数

private void AnimationScale() {          //构造方法的入参如果是“true”,则代表使用默认的interpolator,如果是“false”则代表使用自定义interpolator          AnimationSet animationSet=new AnimationSet(false);            //透明度从0至1          AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);          //旋转两圈          RotateAnimation rotateAnimation=new RotateAnimation(0, 720, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);          //放大十倍          ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 10, 1f, 10, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);          scaleAnimation.setRepeatCount(1);          scaleAnimation.setRepeatMode(Animation.REVERSE);          //平移距离x方向为父控件宽的30.5%,y方向为父控件高的30.5%          TranslateAnimation translateAnimation=new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.RELATIVE_TO_PARENT, 0.305f, Animation.ABSOLUTE, 0, Animation.RELATIVE_TO_PARENT, 0.305f);          translateAnimation.setRepeatCount(1);          translateAnimation.setRepeatMode(Animation.REVERSE);          animationSet.addAnimation(alphaAnimation);          animationSet.addAnimation(rotateAnimation);          animationSet.addAnimation(scaleAnimation);          animationSet.addAnimation(translateAnimation);          //设置动画时长为1秒          animationSet.setDuration(2000);          animationSet.setRepeatMode(AnimationSet.REVERSE);          //设置插值器为先加速再减速          animationSet.setInterpolator(new AccelerateDecelerateInterpolator());          //动画完成后保持位置          animationSet.setFillAfter(false);          //保持动画开始时的状态          animationSet.setFillBefore(true);          //取消动画          animationSet.cancel();          //释放资源          animationSet.reset();          //开始动画          tvshow.startAnimation(animationSet);        }

然后在btntest2的按钮下加入点击事件调用刚才创建的函数

运行起来的效果如图

Exit mobile version