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