MAUI 中实现基础动画效果,主要依靠 View 的扩展方法(如
ScaleTo、
RotateTo、
FadeTo、
TranslateTo)和 Animation 类 自定义时间线。不需要第三方库,Xamarin.Forms 时代延续下来的动画 API 在 MAUI 中依然可用且更稳定。
用内置扩展方法快速实现常见动画
所有继承自
VisualElement的控件(比如
Button、
Label、
Image)都支持链式调用动画方法。它们默认异步执行,返回
Task,可 await 控制时序。
await myButton.ScaleTo(1.2, 200);—— 200 毫秒内放大到 1.2 倍
await myLabel.FadeTo(0, 300, Easing.CubicInOut);—— 300ms 淡出,带缓动效果
await myImage.RotateTo(360, 800, Easing.SinIn);—— 顺时针旋转一圈,正弦缓入
await boxView.TranslateTo(100, 50, 400);—— 相对当前位置平移到 (100, 50)
组合多个动画并控制执行顺序
用
await串行,或用
Task.WhenAll并行。注意:并行动画作用于同一属性(如同时调用两个
ScaleTo)时,后启动的会覆盖前一个。 串行示例:
await btn.ScaleTo(1.3, 150); await btn.ScaleTo(1, 150);—— 先放大再回弹 并行示例:
await Task.WhenAll(btn.FadeTo(0.5, 200), btn.RotateTo(180, 200));想让多个动画“叠加”而非覆盖?得用
Animation类手动管理属性变化过程
用 Animation 类做精细控制(关键帧、回调、循环)
当需要在动画中插入多个关键帧、监听进度、或重复执行时,
Animation是更灵活的选择。它不直接绑定控件,而是由你指定「从哪变到哪」+「怎么变」。 创建动画对象:
var anim = new Animation();添加关键帧:
anim.Add(0, 0.5, new Animation(v => label.Opacity = v, 1, 0.2));(0→0.5 时间段,透明度从 1 变到 0.2) 设置完成回调:
anim.Commit(this, "fadeAnim", length: 400, easing: Easing.CubicOut, finished: (d, b) => { /* 动画结束时执行 */ });
取消动画:this.AbortAnimation("fadeAnim");(需传入 Commit 时的名称)
注意事项和避坑点
动画看似简单,但几个细节容易导致白屏、卡顿或无效:
确保控件已加载完成再启动动画(比如放在OnAppearing或按钮点击事件里,别在构造函数中调用) 避免在循环中无节制地触发动画(例如快速连点按钮),建议加个
isAnimating锁 Android 上某些属性(如
HeightRequest)无法直接动画,应改用
ScaleY或容器布局动画替代 动画期间用户交互默认不阻塞,如需禁用按钮,记得手动设
IsEnabled = false,动画完再恢复
基本上就这些。MAUI 动画不复杂但容易忽略生命周期和线程上下文,用好扩展方法 + 适时上
Animation类,就能覆盖大多数交互动效需求。
