You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让包含两个不同时长动画的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:32:40