NEWS DETAIL

Avalonia中的动画

发布时间:2026/10/25 11:58:25 · 栏目:资讯中心

尧图网络原创建站知识分享正文
义动画示例Avalonia的官方示例项目RenderDemo https://github.com/AvaloniaUI/Avalonia/tree/master/samples/RenderDemo中实现了一个名为CustomStringAnimatorhttps://github.com/AvaloniaUI/Avalonia/blob/master/samples/RenderDemo/Pages/CustomStringAnimator.cs的动画类它继承自InterpolatingAnimatorstring并重写了Interpolate方法来实现打字机效果的动画。以下是该动画类的代码自定义动画使用起来跟普通的动画几乎一样需要指定Animator代码如下https://github.com/AvaloniaUI/Avalonia/blob/master/samples/RenderDemo/Pages/CustomAnimatorPage.xamlView Code值得注意的是在axaml中使用自定义动画器时需要指定动画器的类型Animation.Animatorpages:CustomStringAnimator//Animation.Animator否则会报错。改进的字符串动画在官方示例的基础上我们可以略微做一些改进支持在字符串之间进行插值动画。动画过程中会根据进度逐渐显示新字符串的内容同时保留旧字符串的公共前缀部分。public class StringAnimator : InterpolatingAnimatorstring { /// summary /// 计算插值结果。 /// /summary /// param nameprogress进度0到1之间的值指在两个关键帧之间过渡的时间位置。/param /// param nameoldValue旧值动画开始时第一个关键帧的值。/param /// param namenewValue新值动画结束时最后一个关键帧的值。/param /// returns返回插值结果。/returns public override string Interpolate(double progress, string oldValue, string newValue) { if (progress 0) return oldValue; if (progress 1) return newValue; int oldLength string.IsNullOrEmpty(oldValue) ? 0 : oldValue.Length; int newLength string.IsNullOrEmpty(newValue) ? 0 : newValue.Length; if (oldLength 0 newLength 0) return string.Empty; if (oldLength newLength oldValue newValue) return newValue; if (oldLength 0 || newValue.StartsWith(oldValue)) { // 如果旧值为空或新值以旧值开头则从旧值开始插入新值的剩余部分 return newValue.Substring(0, (int)(oldLength (newLength - oldLength) * progress)); } else if (newLength 0 || oldValue.StartsWith(newValue)) { // 如果新值为空或旧值以新值开头则从新值开始删除旧值的剩余部分 return oldValue.Substring(0, (int)(newLength (oldLength - newLength) * (1 - progress))); } else { //如果没有包含关系忽略旧值直接从新值开始插入 oldLength 0; return newValue.Substring(0, (int)(oldLength (newLength - oldLength) * progress)); } } static StringAnimator() { // 注册动画器 Animation.RegisterCustomAnimatorstring, StringAnimator(); } }使用方法跟官方示例一样。自定义离散动画如果要实现通用的离散动画该怎么实现呢跟上面类似我们可以从InterpolatingAnimatorT继承一个DiscreteAnimatorT类代码很简单放弃中间的过渡部分直接在进度达到100%时切换到新值代码如下public class DiscreteAnimatorT : InterpolatingAnimatorT { public override T Interpolate(double progress, T oldValue, T newValue) { return progress 1 ? oldValue : newValue; } static DiscreteAnimator() { // 注册动画器 Animation.RegisterCustomAnimatorT, DiscreteAnimatorT(); } }使用方法跟上面一样TextBlock Text离散动画器文本切换几种不同的样式。 TextBlock.Styles Style SelectorTextBlock Style.Animations Animation Duration0:0:3 IterationCountInfinite PlaybackDirectionAlternate KeyFrame Cue0% Setter PropertyFontStyle ValueNormal Animation.Animator app:DiscreteAnimator x:TypeArgumentsFontStyle / /Animation.Animator /Setter /KeyFrame KeyFrame Cue30% Setter PropertyFontStyle ValueItalic Animation.Animator app:DiscreteAnimator x:TypeArgumentsFontStyle / /Animation.Animator /Setter /KeyFrame KeyFrame Cue60% Setter PropertyFontStyle ValueOblique Animation.Animator app:DiscreteAnimator x:TypeArgumentsFontStyle / /Animation.Animator /Setter /KeyFrame /Animation /Style.Animations /Style /TextBlock.Styles /TextBlock因为我们使用了泛型在指定动画器时需要使用x:TypeArguments来指定类型参数app:DiscreteAnimator x:TypeArgumentsFontStyle /否则会报错。另一种实现自定义动画的变通方法如果不想实现通用的动画器我们可以注册AvaloniaProperty并在属性的PropertyChanged回调中直接修改属性值来实现动画效果。以下是一个简单的示例演示如何通过注册一个名为DiscreteValue的AvaloniaProperty来实现几何路径变换的动画//注册一个AvaloniaProperty类型为int默认值为0 public const string DISCRETE_VALUE DiscreteValue; public static readonly StyledPropertyint DiscreteValueProperty AvaloniaProperty.RegisterPath, int(DISCRETE_VALUE, 0); //定义一个数组存储不同的几何路径在动画过程中根据DiscreteValue的值来切换不同的路径 private PathGeometry[] bells []; //这里省略了路径的定义 //创建一个动画并运行它 private void PlayAnimation_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) { var animation new Animation() { Duration TimeSpan.FromSeconds(8), IterationCount new IterationCount(2), PlaybackDirection PlaybackDirection.Alternate, Children { new KeyFrame() { Setters { new Setter(DiscreteValueProperty, 0), }, KeyTime TimeSpan.FromSeconds(0) }, new KeyFrame() { Setters { new Setter(DiscreteValueProperty, 1), }, KeyTime TimeSpan.FromSeconds(2) }, new KeyFrame() { Setters { new Setter(DiscreteValueProperty, 2), }, KeyTime TimeSpan.FromSeconds(4) }, new KeyFrame() { Setters { new Setter(DiscreteValueProperty, 3), }, KeyTime TimeSpan.FromSeconds(6) }, new KeyFrame() { Setters { new Setter(DiscreteValueProperty, 3), }, KeyTime TimeSpan.FromSeconds(8) } } }; _ animation.RunAsync(Path1); } //在属性的PropertyChanged事件中根据DiscreteValue的值来切换不同的路径 private void Path1_PropertyChanged(object? sender, Avalonia.AvaloniaPropertyChangedEventArgs e) { if (e.Property.Name DiscreteValueProperty.Name) { Debug.WriteLine($time: {DateTime.Now}, Path1 property changed: {e.Property.Name}, old value: {e.OldValue}, new value: {e.NewValue}); int value (int)e.NewValue; Path1.Data bells[value % bells.Length]; } }
✦

本文为尧图网络原创建站知识分享。想针对自身行业获取定制化建站方案?欢迎咨询,资深顾问免费为你出思路。

RELATED

相关 资讯推荐

MORE

更多 新鲜资讯

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析
2026/10/21 11:24:40

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析

1. 项目概述:从零开始,用JMeter搞定HTTP性能测试 刚接触性能测试的新手,或者是从功能测试转过来的朋友,一听到“压测”两个字,心里可能就有点发怵。工具那么多,概念那么杂,从哪儿下手呢&#xf…

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统
2026/10/24 20:39:51

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统

最近我用TypeScript写了一个运行在浏览器里的Web操作系统 Earendel(目前已知的距离地球最遥远的恒星)。开发它的初衷主要是为了Linux和操作系统课程的教学。市面上绝大多数Web OS项目,要么只是做了一个长得像Windows/macOS的网页UI拼盘&#…

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]
2026/10/25 8:02:16

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形🚀 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: http…

从零制作同人动画:技术路线、流程与实战避坑指南
2026/10/24 7:09:28

从零制作同人动画:技术路线、流程与实战避坑指南

1. 先搞清楚这个“粉丝动画”到底是什么,以及它能解决什么问题看到“五条悟VS宿傩/咒术回战粉丝动画”这个标题,很多人的第一反应可能是去找一个现成的视频。但如果你是一个想自己动手创作、或者想了解这类作品背后技术流程的创作者,这个标题…

闭源降价80%,开源却在涨价:AI定价的交叉路口
2026/10/24 22:16:44

闭源降价80%,开源却在涨价:AI定价的交叉路口

8月6日,两条价格曲线悄然交汇。 一条向下:OpenAI把GPT-5.6 Luna的输出价格从6美元砍到1.2美元/百万Token,降幅80%。另一条向上:同一天,DeepSeek公告全线涨价,措辞是"涨幅较大",非试探…

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买
2026/10/25 8:02:07

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买经常有工厂朋友拿着网上的"三防平板十大品牌排行榜"来问我:到底选哪个?说实话排行榜看看就行,真正选型得看你产线什么场景。今天挑五个在产线数字化里用得比较多的品牌—…

看完这篇,还想了解更多?

预约尧图网络顾问一对一沟通,针对你的行业与现状给出建站建议,全程免费。

免费咨询