MAUI中动画主要依靠View扩展方法(如ScaleTo、FadeTo)和Animation类实现;扩展方法支持链式调用、异步执行与缓动,Animation类支持关键帧、回调与循环控制。

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 类,就能覆盖大多数交互动效需求。










