当前位置: 首页 > news >正文

C# Avalonia 16- Animation- SampleViewer - ReusableFollowExample

ReusableFollowExample.axaml代码

<UserControl 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"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"xmlns:local="using:AvaloniaUI"x:Class="AvaloniaUI.ReusableFollowExample"><Canvas Background="Transparent"><!-- 红色方块 --><local:FollowMouseCanvas Canvas.Left="0" Canvas.Top="0" Width="50" Height="50" Background="Red"><!-- 可以在这里放更多内容 --></local:FollowMouseCanvas><!-- 绿色方块 --><local:FollowMouseCanvas Canvas.Left="300" Canvas.Top="0" Width="50" Height="50" Background="Green"></local:FollowMouseCanvas><!-- 蓝色方块 --><local:FollowMouseCanvas Canvas.Left="0" Canvas.Top="300" Width="50" Height="50" Background="Blue"></local:FollowMouseCanvas></Canvas>
</UserControl>

ReusableFollowExample.axaml.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.VisualTree;
using Shares.Avalonia;
using System;namespace AvaloniaUI;public class FollowMouseCanvas : Canvas
{private Vector velocity;private Point lastMouse;private Canvas? parentCanvas;private readonly AnimationPlayer player = new AnimationPlayer();public FollowMouseCanvas(){player.Fps = 60;player.Loop = true;player.Duration = double.MaxValue;player.At(0).PlayGlobal(UpdatePosition);this.AttachedToVisualTree += (_, __) =>{EnsureParent();player.Start();};}private void EnsureParent(){parentCanvas = this.GetVisualParent() as Canvas;if (parentCanvas != null){parentCanvas.PointerMoved += OnPointerMoved;}}private void OnPointerMoved(object? sender, PointerEventArgs e){if (parentCanvas != null)lastMouse = e.GetPosition(parentCanvas);}private void UpdatePosition(double progress){if (parentCanvas == null)return;double left = Canvas.GetLeft(this);double top = Canvas.GetTop(this);if (double.IsNaN(left)) left = 0;if (double.IsNaN(top)) top = 0;var location = new Point(left, top);var toMouse = lastMouse - location;// 根据 progress 做周期性调制,比如让速度在一个周期中变化double followForce = 0.01 + 0.005 * Math.Sin(progress * 2 * Math.PI * 2); // 2Hz波动double drag = 0.8 + 0.1 * Math.Sin(progress * 2 * Math.PI); // 阻尼轻微变化velocity += toMouse * followForce;velocity *= drag;location += velocity;Canvas.SetLeft(this, location.X);Canvas.SetTop(this, location.Y);}
}
public partial class ReusableFollowExample : UserControl
{public ReusableFollowExample(){InitializeComponent();}
}

运行效果

image

 

http://www.jsqmd.com/news/19170/

相关文章:

  • 2025年五金零件加工厂家权威推荐榜:精密零件/小五金加工/五金精密零件加工专业实力与品质保障精选指南
  • 2025 年风电母线槽厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • 2025年甲醇发动机润滑油厂家权威推荐榜:专业润滑技术,高效能保护,直销源头实力厂家口碑之选
  • 2025 年最新保温装饰一体板厂家排行榜:优选西宁及全国靠谱生产厂家,专业推荐值得信赖
  • 2025年10月deepseek排名优化推荐:高性价比解决方案市场报告
  • 跨网文件交换系统:保障数据安全与加速研发的核心支撑
  • 2025 最新不锈钢管厂家推荐排行榜权威发布:304/316L/2205 等材质焊管无缝管优质企业精选
  • 评测阿里云 RDS for MySQL + DuckDB 架构:QuickBI 分析性能与兼容性实测
  • 2025 年国内地磅生产厂家最新推荐排行榜:聚焦电子 / 物联网 / 无人值守 / 汽车衡 / 防爆等类型,精选综合实力强劲企业
  • 大模型后训练
  • 2025年低烟无卤辐照线厂家推荐排行榜,UL3302低烟无卤,UL3767低烟无卤,UL4413低烟无卤,专业认证与优质性能保障
  • jq工具解析JSON数据操作示例
  • 技术面:Spring(循环依赖,spring与springboot的区别)
  • CI_CD前端发布增加cnpm编译失败跳出不部署的逻辑
  • 2025年GEO品牌推荐榜单:云视GEO领跑行业的技术解析
  • confluence8
  • 2025年10月长白山度假酒店推荐:性价比与景观体验排行
  • 基于分类器AUC的无模型变点检测技术
  • 2025年除尘设备厂家权威推荐榜单:除尘器/脉冲除尘器/中央脉冲除尘器/工业除尘器源头企业综合评测与选购指南
  • 2025 年高强钢板厂家最新推荐排行榜:涵盖宝武 / 合金 / Q550D 等热门型号,优质企业综合实力甄选
  • 2025 年注浆管厂家最新推荐榜:聚焦桩基 / 钢花 / 管棚 / 隧道 / 预埋等多场景需求,精选优质厂家助力工程高效采购
  • 2025年10月中国AI关键词排名优化公司排行:五强实测评价
  • 2025年CNAS认证咨询公司推荐:权威指南,全方位服务解析
  • CRM沦为摆设?纷享销客系统运营分析功能助力企业提升数字化效能
  • 2025年10月GEO优化服务商推荐:全平台同步优化排行榜
  • 2025年10月中国AI关键词排名优化公司推荐榜:五家对比与实测排名
  • 2025年太阳能板品牌综合排名TOP10:深圳精益太阳能板领跑行业
  • 2025年太阳能板品牌综合实力排行榜TOP10:深圳精益太阳能板领跑行业
  • 2025年中国国际健康营养博览会(NHNE):权威深度解析亚洲旗舰展的供需新秩序
  • 2025 年铝板厂家最新推荐榜:聚焦优质铝板企业,为工业与建筑采购提供专业参考1100/3003/3004/5052/5083/ 6061铝板厂家推荐