如何让包含两个不同时长动画的AnimationSet无限重复?
解决AnimationSet顺序执行并无限重复的问题
嘿,这个问题我之前做呼吸类动画的时候刚好碰到过,给你一步步捋清楚怎么搞定:
首先要抓两个核心需求:让两个动画按顺序执行和让整个动画循环无限重复,咱们逐个解决:
1. 实现动画的顺序执行
默认情况下,AnimationSet里的所有动画是同时启动的,所以要让呼气动画等吸气动画跑完再开始,就得给呼气动画设置startOffset,值刚好等于吸气动画的总时长,这样就能完美衔接上。
2. 设置整个动画集无限重复
给AnimationSet本身配置重复规则:把重复次数设为无限,同时指定重复模式为「从头重启」,这样整个“吸气→呼气”的循环就会一直重复下去。
完整代码示例
把你的代码补全并加上关键设置后是这样的:
public void cartoonBreathing(ImageView v, int inhale_time, int exhale_time){ AnimationSet breathing_set = new AnimationSet(true); // 吸气动画:从原大小缩放到2倍,以自身中心为缩放原点 Animation inhale = new ScaleAnimation( 1.0f, 2f, 1.0f, 2f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f ); inhale.setFillAfter(true); // 动画结束后保持最终缩放状态 inhale.setDuration(inhale_time * 1000); // 把秒转成毫秒 // 呼气动画:从2倍缩回到原大小,同样以中心为缩放原点 Animation exhale = new ScaleAnimation( 2.0f, 1f, 2.0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f ); exhale.setFillAfter(true); exhale.setDuration(exhale_time * 1000); // 核心设置:让呼气动画在吸气动画结束后才启动 exhale.setStartOffset(inhale_time * 1000); // 将两个动画加入动画集 breathing_set.addAnimation(inhale); breathing_set.addAnimation(exhale); // 设置无限重复:重复次数为无限,每次重复从头开始执行整个动画集 breathing_set.setRepeatCount(Animation.INFINITE); breathing_set.setRepeatMode(Animation.RESTART); // 给ImageView启动动画 v.startAnimation(breathing_set); }
额外小提醒
- 一定要给呼气动画也加
setFillAfter(true),不然呼气结束后会突然跳回初始大小,破坏呼吸动画的流畅感。 - 如果你的项目是较新的Android版本,也可以考虑用
AnimatorSet替代AnimationSet(新的动画框架,功能更灵活),不过上面的代码在旧框架下完全能正常运行。
内容的提问来源于stack exchange,提问作者Natalie Le
相关产品推荐
相关产品推荐

