Avalonia作为跨平台的.NET UI框架,内置了完善的动画系统,开发者可以通过简单的配置实现控件的平移、缩放、透明度变化等各类动画效果,不需要依赖第三方库就能完成基础交互动效的开发。

Avalonia动画的核心概念
Avalonia的动画系统基于Animation类实现,核心要素包含三个部分:
- 目标属性:需要产生变化的控件属性,比如
Opacity(透明度)、RenderTransform(渲染变换)等 - 关键帧:动画过程中不同时间点的属性值,系统会自动计算中间过渡状态
- 动画播放控制:包括动画的持续时间、重复次数、缓动函数等配置项
实现简单的透明度渐变动画
透明度动画是最基础的动画类型,我们可以让一个按钮在点击后逐渐消失再逐渐显示,具体实现步骤如下:
1. 编写XAML界面代码
首先在界面中添加一个按钮,作为动画的作用目标:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AvaloniaAnimationDemo.MainWindow"
Title="Avalonia动画示例"
Width="400" Height="300">
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<Button x:Name="TargetButton" Content="点击触发动画" Width="120" Height="40" />
</StackPanel>
</Window>
2. 编写后台动画逻辑
在按钮的点击事件中创建并启动动画:
using Avalonia;
using Avalonia.Animation;
using Avalonia.Animation.Easings;
using Avalonia.Controls;
using Avalonia.Media;
using System;
using System.Threading.Tasks;
namespace AvaloniaAnimationDemo
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 绑定按钮点击事件
TargetButton.Click += OnButtonClick;
}
private async void OnButtonClick(object sender, Avalonia.Interactivity.RoutedEventArgs e)
{
// 创建动画实例
var animation = new Animation
{
// 动画持续时间1秒
Duration = TimeSpan.FromSeconds(1),
// 设置缓动函数,让动画变化更自然
Easing = new QuadraticEaseInOut(),
// 设置动画重复次数,这里设置为2次(去1次回1次)
IterationCount = 2,
// 设置重复行为为往返
PlaybackDirection = PlaybackDirection.NormalThenReverse
};
// 添加关键帧,控制透明度变化
// 0秒时透明度为1(完全显示)
var keyFrame1 = new KeyFrame
{
Cue = new Cue(0d)
};
keyFrame1.Setters.Add(new Setter
{
Property = Visual.OpacityProperty,
Value = 1d
});
// 1秒时透明度为0(完全透明)
var keyFrame2 = new KeyFrame
{
Cue = new Cue(1d)
};
keyFrame2.Setters.Add(new Setter
{
Property = Visual.OpacityProperty,
Value = 0d
});
// 把关键帧加入动画
animation.Children.Add(keyFrame1);
animation.Children.Add(keyFrame2);
// 启动动画,作用到目标按钮上
await animation.RunAsync(TargetButton);
}
}
}
实现控件平移缩放组合动画
除了单一属性动画,还可以同时修改多个属性实现组合效果,比如让一个矩形同时平移和缩放:
1. XAML界面添加目标控件
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AvaloniaAnimationDemo.TransformAnimationWindow"
Title="组合动画示例"
Width="400" Height="300">
<Canvas>
<Rectangle x:Name="TargetRect" Fill="LightBlue" Width="50" Height="50" Canvas.Left="50" Canvas.Top="50">
<Rectangle.RenderTransform>
<TransformGroup>
<TranslateTransform x:Name="RectTranslate" X="0" Y="0" />
<ScaleTransform x:Name="RectScale" ScaleX="1" ScaleY="1" />
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
<Button Content="触发组合动画" Canvas.Left="50" Canvas.Top="120" Click="OnTransformButtonClick" />
</Canvas>
</Window>
2. 后台实现组合动画逻辑
using Avalonia;
using Avalonia.Animation;
using Avalonia.Animation.Easings;
using Avalonia.Controls;
using Avalonia.Media;
using System;
using System.Threading.Tasks;
namespace AvaloniaAnimationDemo
{
public partial class TransformAnimationWindow : Window
{
public TransformAnimationWindow()
{
InitializeComponent();
}
private async void OnTransformButtonClick(object sender, Avalonia.Interactivity.RoutedEventArgs e)
{
// 创建平移动画
var translateAnimation = new Animation
{
Duration = TimeSpan.FromSeconds(1.5),
Easing = new CubicEaseOut()
};
// 平移X从0到150
var translateKeyFrame1 = new KeyFrame { Cue = new Cue(0d) };
translateKeyFrame1.Setters.Add(new Setter
{
Property = TranslateTransform.XProperty,
Value = 0d
});
var translateKeyFrame2 = new KeyFrame { Cue = new Cue(1d) };
translateKeyFrame2.Setters.Add(new Setter
{
Property = TranslateTransform.XProperty,
Value = 150d
});
translateAnimation.Children.Add(translateKeyFrame1);
translateAnimation.Children.Add(translateKeyFrame2);
// 创建缩放动画
var scaleAnimation = new Animation
{
Duration = TimeSpan.FromSeconds(1.5),
Easing = new CubicEaseOut()
};
// 缩放从1倍到1.5倍
var scaleKeyFrame1 = new KeyFrame { Cue = new Cue(0d) };
scaleKeyFrame1.Setters.Add(new Setter
{
Property = ScaleTransform.ScaleXProperty,
Value = 1d
});
scaleKeyFrame1.Setters.Add(new Setter
{
Property = ScaleTransform.ScaleYProperty,
Value = 1d
});
var scaleKeyFrame2 = new KeyFrame { Cue = new Cue(1d) };
scaleKeyFrame2.Setters.Add(new Setter
{
Property = ScaleTransform.ScaleXProperty,
Value = 1.5d
});
scaleKeyFrame2.Setters.Add(new Setter
{
Property = ScaleTransform.ScaleYProperty,
Value = 1.5d
});
scaleAnimation.Children.Add(scaleKeyFrame1);
scaleAnimation.Children.Add(scaleKeyFrame2);
// 同时启动两个动画
var task1 = translateAnimation.RunAsync(RectTranslate);
var task2 = scaleAnimation.RunAsync(RectScale);
await Task.WhenAll(task1, task2);
}
}
}
动画使用的注意事项
- 动画的目标属性必须是依赖属性,否则无法被动画系统识别修改
- 如果动画不需要往返效果,可以把
PlaybackDirection设置为PlaybackDirection.Normal,同时调整IterationCount为1 - 缓动函数可以选择不同的类型,比如
LinearEasing(匀速)、BounceEase(弹跳效果)等,根据实际需求选择 - 动画运行时会占用一定的UI线程资源,不要在短时间内触发大量复杂动画,避免界面卡顿
如果需要更复杂的动画序列,可以把多个动画组合成AnimationGroup,按顺序或者同时执行,满足更复杂的交互效果需求。
Avalonia动画AnimationsUI开发控件变换修改时间:2026-06-25 15:21:54