C# Avalonia 15- Animation- AnimationPlayerTest

news/2025/9/20 11:37:49/文章来源:https://www.cnblogs.com/dalgleish/p/19102202

自己实现一个AnimationPlayer类

AnimationPlayer类

    public partial class AnimationPlayer : ObservableObject{private readonly DispatcherTimer timer;private DateTime? startTime;private DateTime? pauseTime;private bool isRunning;[ObservableProperty]private double _speed = 1.0;[ObservableProperty]private TimeSpan _duration = TimeSpan.FromSeconds(10);[ObservableProperty]private double _progress;[ObservableProperty]private string _timeText = "[[ stopped ]]";[ObservableProperty]private bool _canPause = false;[ObservableProperty]private bool _canResume = false;[ObservableProperty]private bool _canStop = false;// 用户定义的属性应用逻辑public Action<double>? ApplyAction { get; set; }public AnimationPlayer(){timer = new DispatcherTimer{Interval = TimeSpan.FromMilliseconds(50)};timer.Tick += (_, __) => UpdateProgress();}// 开始播放public void Start(){startTime = DateTime.Now;pauseTime = null;isRunning = true;timer.Start();UpdateStates();}// 暂停播放public void Pause(){if (!isRunning) return;pauseTime = DateTime.Now;isRunning = false;timer.Stop();UpdateStates();}// 恢复播放public void Resume(){if (isRunning || startTime == null || pauseTime == null) return;var pausedDuration = DateTime.Now - pauseTime.Value;startTime += pausedDuration;pauseTime = null;isRunning = true;timer.Start();UpdateStates();}// 停止播放public void Stop(){isRunning = false;timer.Stop();startTime = null;pauseTime = null;Progress = 0;TimeText = "[[ stopped ]]";ApplyAction?.Invoke(0);UpdateStates();}// 跳转到指定时间点public void Seek(TimeSpan offset){if (startTime == null) return;startTime = DateTime.Now - TimeSpan.FromTicks((long)(offset.Ticks / Speed));}private void UpdateProgress(){if (startTime == null) return;TimeSpan elapsed;if (isRunning){elapsed = (DateTime.Now - startTime.Value) * Speed;}else if (pauseTime != null){elapsed = (pauseTime.Value - startTime.Value) * Speed;}else{elapsed = TimeSpan.Zero;}if (elapsed >= Duration){elapsed = Duration;isRunning = false;timer.Stop();}Progress = Math.Clamp(elapsed.TotalSeconds / Duration.TotalSeconds, 0, 1);// 带毫秒TimeText = elapsed.ToString(@"hh\:mm\:ss\.ffff");ApplyAction?.Invoke(Progress);UpdateStates();}// 更新 CanPause/CanResume/CanStop 状态private void UpdateStates(){CanPause = isRunning;CanResume = !isRunning && startTime != null && pauseTime != null;CanStop = startTime != null;}}

AnimationPlayerTest.axaml代码

<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Height="396" Width="360.8"x:Class="AvaloniaUI.AnimationPlayerTest"xmlns:local="using:Shares.Avalonia"x:DataType="local:AnimationPlayer"Title="AnimationPlayerTest"><Grid RowDefinitions="auto,auto,auto,auto,auto"><Grid><Image Source="avares://AvaloniaUI/Resources/Images/night.jpg"/><Image Source="avares://AvaloniaUI/Resources/Images/day.jpg" Name="imgDay"/></Grid><StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center" Margin="5" VerticalAlignment="Top"><Button Name="cmdStart" Content="Start"/><Button Name="cmdPause" Content="Pause" IsEnabled="{Binding CanPause}"/><Button Name="cmdResume" Content="Resume" IsEnabled="{Binding CanResume}"/><Button Name="cmdStop" Content="Stop" IsEnabled="{Binding CanStop}"/><Button Name="cmdMiddle" Content="Move To Middle"/></StackPanel><TextBlock Grid.Row="2" Name="lblTime" HorizontalAlignment="Center"></TextBlock><Grid Grid.Row="3" Margin="5" ColumnDefinitions="auto,*">    <TextBlock Margin="0,15,5,0">Speed:</TextBlock><Slider Grid.Column="1" Name="sldSpeed" Minimum="0.1" Maximum="3" Value="1" TickPlacement="BottomRight" TickFrequency="0.1"/></Grid><ProgressBar Grid.Row="4" Margin="0,5,0,0" Height="10" Name="progressBar" Minimum="0" Maximum="1"/></Grid>
</Window>

AnimationPlayerTest.axaml.cs代码

using Avalonia;
using Avalonia.Animation;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Shares.Avalonia;
using System;namespace AvaloniaUI;public partial class AnimationPlayerTest : Window
{private readonly AnimationPlayer? player;public AnimationPlayerTest(){InitializeComponent();player = new AnimationPlayer{Duration = TimeSpan.FromSeconds(10),Speed = 1.0,ApplyAction = progress =>{// 控制 imgDay 的透明度[1,0]imgDay.Opacity = 1 - progress;// 更新进度条progressBar.Value = progress;// 更新时间文本lblTime.Text = player?.TimeText;}};// 绑定按钮cmdStart.Click += (_, _) => player.Start();cmdPause.Click += (_, _) => player.Pause();cmdResume.Click += (_, _) => player.Resume();cmdStop.Click += (_, _) => player.Stop();cmdMiddle.Click += (_, _) => player.Seek(TimeSpan.FromSeconds(5));// 绑定速度sldSpeed.ValueChanged += (_, _) =>{player.Speed = sldSpeed.Value;};this.DataContext = player;}
}

运行效果

image

 

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

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

相关文章

Windows电脑快捷键

Windows电脑快捷键tab 用于切换菜单,以及在编写文本时空四个格子 功能键shift 控制键Ctrl win键 用于打开菜单 组合ctrl+shift=切换输入法 ctrl+shift+esc=打开任务管理器 alt+fn+f4=撤销当前窗口 Ctrl+C=复制 ctrl+S…

基于Python+Vue开发的体育场馆预约管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的体育场馆预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习…

JSONArray集合根据某个字段查询对象

JSONArray list = new JSONArray(); JSONObject json1 = new JSONObject(); json1.put("code","10086"); json1.put("name","张三"); list.add(json1); JSONObject json2 = n…

详细介绍:Parasoft C/C++test 针对嵌入式开发的内存错误检测解决方案

详细介绍:Parasoft C/C++test 针对嵌入式开发的内存错误检测解决方案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

[WC2006] 水管局长

显然,这道题需要维护一棵最小生成树,支持动态删边,查询链上最大值。查询链上最大值可以倍增维护,但是本题 \(n\) 较小,直接暴力往上跳也是可过的。 接下来就是如何动态维护最小生成树的问题了。对于一般图的最小生…

02-Media-7-uvc.py 应用软件解码的USB摄像头(UVC)捕获视频并显示的程序

02-Media-7-uvc.py 应用软件解码的USB摄像头(UVC)捕获视频并显示的程序pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

YOLO入门理解 3YOLOv1 思路与细节

入门理解 YOLOv1 思路与细节 核心概念YOLOv1:第一个提出端到端单阶段目标检测的模型,将检测任务转化为回归问题。 网格划分 (SS):输入图像被划分为固定网格,每个网格负责预测落在其中心的物体。 候选框 (Bounding…

完整教程:Qt开发经验 --- qmake执行系统命令(15)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

YOLO入门理解 评估指标

入门理解 评估指标 核心概念IoU(Intersection over Union):预测框与真实框的交并比,用来衡量检测结果是否准确。 Precision(精度):正确预测为正例的比例(TP / (TP + FP))。 Recall(召回率 / 查全率):实际…

清除win+r“运行”对话框中的历史记录

方法一:通过“文件夹选项”清除 按下 Win + R键打开“运行”对话框。 输入 control folders后回车,打开“文件夹选项”(Win 10+版本为“文件资源管理器选项”)。在“常规”选项卡下,找到“隐私”部分。 点击“清除…

[ICPC 2024 Yokohama R] Peculiar Protocol

我们约定:\(f_{l,r}\) 表示 \([l,r]\) 最多可以进行的操作次数(不一定要全部消掉)。 \(s_{l,r}\) 表示 \([l,r]\) 的 \(a\) 的和。考虑 \(f\) 应该怎么求解,根据区间 DP 的套路我们枚举中间点: \[f_{i,j}=\max\li…

YOLO入门理解 基础概念

核心概念YOLO(You Only Look Once):一种基于单阶段(one-stage)的目标检测框架,直接通过 CNN 回归得到检测框框与类别,特点是速度快、适合实时检测。 One-Stage 与 Two-Stage 检测:One-Stage:直接通过网络输出…

The 2025 ICPC Asia East Continent Online Contest (II)(C,D,E,H,I)

C. Jiaxun! C思路 首先来了解一下 \(Hall\) 定理,对于二分图 \(G<X+Y, M>\) ( \(X\) 表示左边点集,\(Y\) 表示右边点集,\(M\) 表示边集),令 \(W\) 表示 \(X\) 的子集, \(N(W)\) 表示 \(W\) 邻居的点集,则…

深入解析:不同上位开发语言、PLC下位平台、工业协议与操作系统平台下的数据类型通用性与差异性详解

深入解析:不同上位开发语言、PLC下位平台、工业协议与操作系统平台下的数据类型通用性与差异性详解2025-09-20 11:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal …

2022年十大Web黑客技术提名开启

本文宣布2022年十大Web黑客技术提名正式开始,旨在收集社区对最具创新性和可复用性的Web安全研究技术的提名,涵盖HTTP请求走私、缓存投毒、WAF绕过等前沿攻击手法。2022年十大Web黑客技术 - 提名开启 James Kettle 研…

13. LangChain4j + 加入检索增加生成 RAG(知识库) - Rainbow

13. LangChain4j + 加入检索增加生成 RAG(知识库) @目录13. LangChain4j + 加入检索增加生成 RAG(知识库)RAG 的概念LangChain4j RAG 的使用理论LangChain4j RAG 的实战最后: RAG 的概念官网:https://docs.langchain…

实用指南:微信小程序-6-页面布局和事件绑定以及页面跳转

实用指南:微信小程序-6-页面布局和事件绑定以及页面跳转2025-09-20 10:56 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important;…

终旅之始——2025 . 9 . 20

开始的结束,结束的开始。今天是 2025 年九月的第三个星期六,也就是 CSP-2025 初赛的日子。 这是我最后一次以学生身份参加 CSP 了啊,想来还是有些悲伤。 2023 年,那时的我应该是紧张的,2024 年,那时的我的确是平…

CentOS 7 源码版 PhpMyAdmin 安装指南(适配 Nginx+PHP-FPM 环境) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入理解Django Admin只读字段与保存模型的自定义操作 - 详解

深入理解Django Admin只读字段与保存模型的自定义操作 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…