当前位置:网站首页>SkiaSharp 之 WPF 自绘 弹动小球(案例版)
SkiaSharp 之 WPF 自绘 弹动小球(案例版)
2022-07-29 14:33:00 【蓝创精英团队】
没想到粉丝对界面效果这么喜欢,接下来就尽量多来点特效,当然,特效也算是动画的一部分了。WPF里面已经包含了很多动画特效的功能支持了,但是,还是得自己实现,我这边就来个自绘实现的。
弹动小球
弹动小球是一个很常见的页面特效,类似于,拖动物体或者窗体,实现了抖动效果一样。还是值得学习一二的,实际上,也很简单,只需要一个弹动系数和摩擦系数即可。
Wpf 和 SkiaSharp
新建一个WPF项目,然后,Nuget包即可
要添加Nuget包
Install-Package SkiaSharp.Views.WPF -Version 2.88.0
其中核心逻辑是这部分,会以我设置的60FPS来刷新当前的画板。
skContainer.PaintSurface += SkContainer_PaintSurface;
_ = Task.Run(() =>
{
while (true)
{
try
{
Dispatcher.Invoke(() =>
{
skContainer.InvalidateVisual();
});
_ = SpinWait.SpinUntil(() => false, 1000 / 60);//每秒60帧
}
catch
{
break;
}
}
});
弹球实体代码 (Ball.cs)
public class Ball
{
public double X {
get; set; }
public double Y {
get; set; }
public double VX {
get; set; }
public double VY {
get; set; }
public int R {
get; set; }
public SKColor sKColor {
get; set; } = SKColors.Blue;
}
弹动核心类 (Shake.cs)
/// <summary>
/// 弹动特效
/// </summary>
public class Shake
{
public SKPoint centerPoint;
public int Radius = 0;
/// <summary>
/// 弹动系数
/// </summary>
public double Spring = 0.02;
public double TargetX;
/// <summary>
/// 摩擦系数
/// </summary>
public double Friction = 0.95;
public Ball Ball;
public void Init(SKCanvas canvas, SKTypeface Font, int Width, int Height)
{
if (Ball == null)
{
Ball = new Ball();
Ball.X = 60;
Ball.Y = Height / 2;
Ball.R = 30;
}
}
/// <summary>
/// 渲染
/// </summary>
public void Render(SKCanvas canvas, SKTypeface Font, int Width, int Height)
{
Init(canvas, Font, Width, Height);
centerPoint = new SKPoint(Width / 2, Height / 2);
this.Radius = 30;
this.TargetX = Width / 2;
canvas.Clear(SKColors.White);
var ax = (TargetX - Ball.X) * Spring;
Ball.VX += ax;
Ball.VX *= Friction;
Ball.X += Ball.VX;
DrawCircle(canvas, Ball);
using var paint = new SKPaint
{
Color = SKColors.Blue,
IsAntialias = true,
Typeface = Font,
TextSize = 24
};
string by = $"by 蓝创精英团队";
canvas.DrawText(by, 600, 400, paint);
}
/// <summary>
/// 画一个圆
/// </summary>
public void DrawCircle(SKCanvas canvas, Ball ball)
{
using var paint = new SKPaint
{
Color = SKColors.Blue,
Style = SKPaintStyle.Fill,
IsAntialias = true,
StrokeWidth = 2
};
canvas.DrawCircle((float)ball.X, (float)ball.Y, ball.R, paint);
}
public void ReSet()
{
Ball.X = 60;
}
}
效果如下:

这个特效原理是可以运用到任何物体上的,会产生很神奇的效果,后面可以再搞一些案例。
总结
第一次实现特效,当初学FLash,就见到过很多特效的效果,现在自己用敲出来特效感觉是挺不一样的。
代码地址
https://github.com/kesshei/WPFSkiaShakeDemo.git
https://gitee.com/kesshei/WPFSkiaShakeDemo.git
阅
一键三连呦!,感谢大佬的支持,您的支持就是我的动力!
版权
蓝创精英团队(公众号同名,CSDN同名,CNBlogs同名)
边栏推荐
- 数据库mysql的执行顺序(sql语句大全实例教程)
- 代码越写越乱?那是因为你没用责任链
- 第4章_3——索引的使用
- C51 存储类型与存储模式
- 令人难以置信的DeepMind数据库现在包括了科学界已知的几乎所有蛋白质
- Linux installation of MySQL (super detailed)
- RAMAN CONFIGURE 命令都能实现哪些功能
- RAMAN 中 OPTIMIZATION 优化选项的作用
- Domestic mobile phones turn users into their advertising broilers, no wonder consumers are buying iPhones
- 带你搞懂 Redis 中的两个策略
猜你喜欢

双非渣渣的上岸之路!备战60天,三战滴滴侥幸收获Offer

Work Efficiency - Fifteen minutes allows you to quickly learn Markdown syntax to proficient in typesetting practice notes

测试日报怎么写 ?

微服务实战|集中配置中心Config非对称加密与安全管理

工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘

自定义fingerprint特征

How to return all prime factors of a number?
令人难以置信的DeepMind数据库现在包括了科学界已知的几乎所有蛋白质

图斑自上而下,自左而右顺序编码,按照权属单位代码分组,每组从1开始编码

第4章_2——视图的使用
随机推荐
电视处理器a53和a55哪个厉害(cortexa55处理器好吗)
这 6 款在线 PDF 转换工具,得试
面试官:生产环境中 CPU 利用率飙高怎么办?
Interfaces and Abstractions
【LeetCode】53. 最大子数组和
Map遍历 key-value 的4种方法
题目 1125: C语言训练-委派任务*
协同多智能体学习的价值分解网络的原理与代码复现
全球级的分布式数据库 Google Spanner原理 热:报错
【微服务】(十六)—— 分布式事务Seata
Google Cloud X Kyligence|如何从业务视角管理数据湖?
【LeetCode】121. 买卖股票的最佳时机
xss内容总结
RAMAN 中 OPTIMIZATION 优化选项的作用
测试时间的评估:开发时间的1/3~1/2
【yolov7系列二】正负样本分配策略
一篇适合新手的深度学习综述!
Shared memory - shmget filling holes
ArcGIS Molder Builder模型构建器基本知识
嵌入式开发经验分享,把学习当作一种兴趣