Android中ViewPropertyAnimator首次运行后旋转动画失效问题
问题分析与解决方案
你遇到的这个问题其实很典型——首次旋转动画生效、后续失效的核心原因是ViewPropertyAnimator的rotation()是设置「目标绝对角度」。第一次执行rotation(360f)后,ImageView的旋转角度已经停在了360度,后续再调用rotation(360f)时,因为当前角度和目标角度完全一致,系统会判定不需要执行动画,所以旋转效果就消失了,只剩淡入淡出在工作。
两种可行的修复方案
方案1:使用相对旋转rotationBy()
rotationBy()是设置「相对当前角度的增量」,每次调用都会让ImageView在现有角度基础上旋转指定度数,这样不管当前角度是多少,都能稳定触发360度旋转动画。
修改后的代码如下:
boolean isImage1Showing = true; public void fadeAndRotate(View view){ if (isImage1Showing){ // 合并旋转与淡出动画,链式调用更简洁 imageViewA.animate() .rotationBy(360f) .alpha(0) .setDuration(2000); imageViewB.animate() .alpha(1) .setDuration(2000); isImage1Showing = false; } else { isImage1Showing = true; imageViewB.animate() .rotationBy(360f) .alpha(0) .setDuration(2000); imageViewA.animate() .alpha(1) .setDuration(2000); } }
方案2:动画前重置旋转角度
如果希望旋转后ImageView的角度回到初始状态(0度),可以在每次执行旋转动画前,先把ImageView的rotation重置为0,再设置目标角度360f。这种方式适合需要保持视图最终角度不变的场景。
修改后的代码示例:
boolean isImage1Showing = true; public void fadeAndRotate(View view){ if (isImage1Showing){ // 先重置角度为0,再触发360度旋转动画 imageViewA.setRotation(0f); imageViewA.animate() .rotation(360f) .alpha(0) .setDuration(2000); imageViewB.animate() .alpha(1) .setDuration(2000); isImage1Showing = false; } else { isImage1Showing = true; imageViewB.setRotation(0f); imageViewB.animate() .rotation(360f) .alpha(0) .setDuration(2000); imageViewA.animate() .alpha(1) .setDuration(2000); } }
小提示:把同一个ImageView的旋转和alpha动画合并到同一个animate()调用链中,不仅代码更简洁,还能确保两个动画完全同步执行~
内容的提问来源于stack exchange,提问作者AJ48
相关产品推荐
相关产品推荐

