学习|Android属性动画的组合动画之一–AnimationSet
- 2019 年 11 月 25 日
- 筆記
学更好的别人,
做更好的自己。
——《微卡智享》
Android组合动画
上篇文章我们介绍了《学习|Android属性动画的基础介绍》,里面只做了一个简单的动画例子,其实真正使用的时候一般我们都是通过动画的多样组合进行播放的,本章就专门介绍一下Android中的动画组合之一AnimationSet的介绍。
动画组合的四种方式
AnimationSet和Animatorset
一般来说,Android实现动画组合有四种方式,分别是:
- AnimationSet
- AnimatorSet
- PropertyValuesHolder
- ViewPropertyAnimator
个人来说我用到的基本就前两种,所以也主要就介绍一下前两种。前两种的名称差不多,其实也是有其不同之处,这里简单介绍一下两个的不同点。
AnimationSet和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的按钮下加入点击事件调用刚才创建的函数
运行起来的效果如图