Xamarin Android中ImageView用AnimationSet实现淡入淡出动画失败原因咨询
为什么AnimationSet无法实现平滑的淡入淡出串行动画
核心原因
AnimationSet的设计目标是让多个动画并行作用于同一个控件,所有动画的计算都是基于控件的原始初始状态(这里是初始透明度1.0f),而非前一个动画结束后的状态。
当你把fadeOut(1f→0f,5秒)和fadeIn(0f→1f,5秒,StartOffset=5000ms)加入同一个AnimationSet时:
- 0-5秒内:fadeOut执行,但AnimationSet会错误地将两个动画的最终状态合并,直接把ImageView的透明度设置为fadeOut的目标值0f,跳过渐变过程;
- 5-10秒内:fadeIn启动,但它是基于原始的1.0f透明度计算,相当于从1f→1f,没有任何渐变效果,直到10秒动画结束后,fillAfter属性触发才将透明度切回1f,所以看起来是10秒后突然变回不透明。
而通过AnimationEnd事件触发fadeIn的方式,是让fadeOut完全执行完毕后,再基于它的结束状态(0f透明度)启动fadeIn,属于串行执行,因此能正常实现渐变效果。
替代实现方案(用属性动画实现串行动画)
如果想实现顺序执行的淡入淡出,推荐使用AnimatorSet(属性动画体系),它支持按顺序执行动画,且基于控件当前属性值计算,不会出现AnimationSet的问题:
// 创建淡出动画 var fadeOut = ObjectAnimator.OfFloat(yourImageView, "alpha", 1f, 0f); fadeOut.SetDuration(5000); // 创建淡入动画 var fadeIn = ObjectAnimator.OfFloat(yourImageView, "alpha", 0f, 1f); fadeIn.SetDuration(5000); // 按顺序执行两个动画 var animatorSet = new AnimatorSet(); animatorSet.PlaySequentially(fadeOut, fadeIn); animatorSet.Start();
内容的提问来源于stack exchange,提问作者Andy Johnson
相关产品推荐
相关产品推荐

