Android 自定义XML补间动画设置无限重复后仍仅运行一次如何解决
问题根因
- Android 中的
AnimationSet不会将你设置的重复计数、重复模式自动同步到内部包含的子动画上,且AnimationSet本身的repeatCount、repeatMode属性官方明确标注为无效,仅对单个子动画生效。 - 你当前只给
<scale>标签配置了无限重复属性,<alpha>标签没有配置重复属性,第一次动画跑完后 alpha 值会固定为 0,后续即便 scale 动画在重复执行,视图也不可见,所以看起来动画只运行了一次。
解决方案
方案1:给所有子动画统一配置重复属性
直接修改 animation.xml,给 alpha 标签也加上和 scale 一致的重复配置即可,修改后的代码如下:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0" android:toXScale="1" android:fromYScale="0" android:toYScale="1" android:pivotX="50%" android:pivotY="50%" android:repeatMode="restart" android:repeatCount="infinite"/> <alpha android:fromAlpha="1" android:toAlpha="0" android:repeatMode="restart" android:repeatCount="infinite"/> </set>
Java 代码无需额外修改,原有逻辑即可正常运行。
方案2:通过动画监听实现整体重复
如果需要整个动画集作为整体统一控制重复,可以给动画设置监听,在动画结束时重新启动:
修改后的 MainActivity 代码如下:
public class MainActivity extends AppCompatActivity { private View view; private Animation animation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); view = findViewById(R.id.view); animation = AnimationUtils.loadAnimation(this, R.anim.animation); animation.setDuration(6000); // 给动画加结束监听,结束时重新启动 animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) {} @Override public void onAnimationEnd(Animation anim) { view.startAnimation(animation); } @Override public void onAnimationRepeat(Animation animation) {} }); view.startAnimation(animation); } }
这个方案不需要修改XML配置,也能实现整体动画的无限重复效果。
内容的提问来源于stack exchange,提问作者user5957595
相关产品推荐
相关产品推荐

