Avalonia 后台代码简单播放动画示例

news/2024/9/12 15:07:25/文章来源:https://www.cnblogs.com/lindexi/p/18368582

本文将演示如何在 Avalonia 的后台代码里面创建 Animation 执行播放

本文演示的内容是将界面里面的一个 TextBlock 控件,通过修改控件的 RenderTransform 的 TranslateTransform 执行平移

为了方便演示,先在 MainView.axaml 里面添加一个 TextBlock 控件,如下面代码。大家可以在本文末尾找到本文所有的代码的下载方法

  <TextBlock Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center"><TextBlock.RenderTransform><TranslateTransform X="700"/></TextBlock.RenderTransform></TextBlock>

接下来演示如何在后台代码里面创建动画和播放动画

演示的代码放在 Loaded 事件里面,强行使用 Task.Delay 模拟业务的延迟。当然了,如果只是动画本身期望延迟,可以使用 Animation 的 Delay 属性执行延迟

public partial class MainView : UserControl
{public MainView(){InitializeComponent();Loaded += MainView_Loaded;}private async void MainView_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e){// 这里的延迟换成 Animation 的 Delay 也对的,且换成 Animation 的更好。这里的延迟非必须await Task.Delay(100);... // 忽略其他代码}

先创建 Animation 对象,设置动画的过程时间,如下面代码所示

        var animation = new Animation(){Duration = TimeSpan.FromSeconds(10),... // 忽略其他代码};

接着添加核心的逻辑,通过关键帧动画,设置 TranslateTransform 的 XProperty 在第 0 秒的时候从 0 开始,在第 10 秒的时候为 500d 的值。如此即可作出平缓的动画,实现 TranslateTransform 的 X 从 0 移动到 500 的值,且过程动画用 10 秒

        var animation = new Animation(){Duration = TimeSpan.FromSeconds(10),IterationCount = new IterationCount(5),PlaybackDirection = PlaybackDirection.Alternate,Children ={new KeyFrame(){Setters ={new Setter(TranslateTransform.XProperty, 0d),},KeyTime = TimeSpan.FromSeconds(0)},new KeyFrame(){Setters ={new Setter(TranslateTransform.XProperty, 500d),},KeyTime = TimeSpan.FromSeconds(10)}}};

这里需要小心一个细节,那就是 XProperty 是定义了 double 类型的属性,要求传入的参数也是 double 类型的。如果这里没有写 0d 而是写 0 将会在后续播放动画步骤啥都没有发生。我认为这里是 Avalonia 的一个设计缺陷,应该在框架层做好转换类型逻辑

完成动画定义之后,现在动画还没附加在某个控件进行播放,咱就从用户控件里面获取刚才界面定义的控件,例子代码如下

        var content = Content;var textBlock = (TextBlock)content!;

拿到控件之后,使用 Animation 的 RunAsync 方法进行播放,这个方法可以不等待返回值。只有在期望等待到动画播放结束的时候,才需要等待返回值的 Task 完成

在 Avalonia 里面存在一个设计缺陷是没有提供和 WPF 一样的故事板,如果有多个控件同时播放动画只好多次调用 RunAsync 方法,且多次调用之间不要加上 await 等待

        _ = animation.RunAsync(textBlock);

全部的后台创建和播放动画代码如下

        var content = Content;var textBlock = (TextBlock)content!;var animation = new Animation(){Duration = TimeSpan.FromSeconds(10),IterationCount = new IterationCount(5),PlaybackDirection = PlaybackDirection.Alternate,Children ={new KeyFrame(){Setters ={new Setter(TranslateTransform.XProperty, 0d),},KeyTime = TimeSpan.FromSeconds(0)},new KeyFrame(){Setters ={new Setter(TranslateTransform.XProperty, 500d),},KeyTime = TimeSpan.FromSeconds(10)}}};_ = animation.RunAsync(textBlock);

本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 77ef3ad873b021c71c80ca08cfbff5cadda5e3fc

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 77ef3ad873b021c71c80ca08cfbff5cadda5e3fc

获取代码之后,进入 AvaloniaIDemo/QarnahedajaceYawemcehem 文件夹,即可获取到源代码

更多 AvaloniaI 博客,请参阅 博客导航

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784093.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读软件开发安全之道:概念、设计与实施03威胁

读软件开发安全之道:概念、设计与实施03威胁1. 威胁 1.1. 威胁常常比事件本身更加可怖1.1.1. 索尔阿林斯基1.2. 威胁无处不在1.2.1. 如果妥善管理,我们也可以安然与威胁共存1.2.2. 我们自己没有几百万年进化而来的本能来防御软件方面的威胁1.3. 把视角从软件构建者转向攻击者…

ubuntu18.04安装dns服务器

1. 安装dnsmasqsudo apt install dnsmasq 2. 在配置文件/etc/dnsmasq.conf末尾添加自定义域名 3. 测试配置文件sudo dnsmasq --test 4. 开启dns服务sudo systemctl restart dnsmasq

CloudFlare Workers 日志管理方案全解析

CloudFlare Workers, Logpush, Tail Workers, Real-time Logging, 实时日志服务, 低成本目录引言 Logpush介绍 推送目标 操作步骤Tail Workers介绍 操作步骤实时日志介绍 使用方法 局限性替代方案:手动发送日志实现方式 注意事项方案选择推荐方案:手动发送日志到Sentry总结在…

java八股 并发+数据结构

CAS缺点耗费cpu aba问题当前进度 https://javaguide.cn/java/concurrent/java-concurrent-questions-02.html#reentrantreadwritelock

035、Vue3+TypeScript基础,路由params参数时,使用defineProps自动获得数据

01、New.vue代码如下:<template><div class="app-container"><!-- 导航区域容器 --><div class="sidebar"><ul class="news-list"><!--第一种写法--><li v-for="news in newsList" :key=&quo…

Vue3---基础

vue3基础: vue2里面做一个基础的数据渲染:在VUE3里面,可以直接声明在 setup 函数里面: 此时会发现仅仅是单向数据绑定,使用ref进行双向数据绑定:还可以进行简化:同样可以写一个点击事件:打完收工!

【待看】EDR联动数据包封锁技术

一、摘要 利用中间人攻击(PitM)和过滤EDR特定通讯数据包, 可以干扰和阻止EDR与云服务器的通讯过程, 从而有效隐藏报警信息, 使其不被SOC团队察觉。这种效果可以通过对目标主机实行ARP欺骗并配置iptables来实现。这种方法的优势在于不需要管理员权限或对受害主机的访问, 但需要一…

034、Vue3+TypeScript基础,路由params参数的使用

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue//引入路由 import router from ./routerconst app = createApp(App); //使用路由 app.use(router); // App.vue的根元素id为app app.mount…

RocketMQ 的convertAndSend方法和syncSend方法区别

RocketMQ的convertAndSend方法和syncSend方法是两种不同的消息发送 convertAndSend方法是将消息内容转换为指定的格式,然后发送到指定的消息队列。这个方法是异步发送的,也就是说,发送消息后就立即返回并不等待对方的响应。 syncSend方法则是同步发送消息,也就是说发送消息…

CSDN取消关注博主才可阅读全文限制

安装这个脚本可以跳过关注 脚本地址作者:翎野君 出处:http://www.cnblogs.com/lingyejun/ 若本文如对您有帮助,不妨点击一下右下角的【推荐】。如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。转载文章请务必保留出处和署名,否则保留追究法…

c语言中%f输出double型和float型值

001、[root@PC1 test]# ls test.c [root@PC1 test]# cat test.c #include <stdio.h>int main(void) {double i; //声明double型 和 float型变量float j;i = 3.14;j = 3.14;printf("i = %f\n", i);printf("j = %f\n", j);return 0; } […

unbuntu更新Python3版本到最新,安装依赖手动编译

安装依赖sudo apt update sudo apt install build-essential zlib1g-dev libffi-dev libssl-dev下载安装包,手动配置编译 官网查找对应linux版本tgz包wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz tar -xzvf Python-3.11.0.tgz cd Python-3.11.0配置编译…