WPF+SkiaSharp实现自绘拖曳小球
作者:蓝创精英团队 时间:2023-03-25 01:31:14
拖曳小球
WPF的拖曳效果,基本配置一下,就可以了,但是自绘的话,就得自己控制,按键点击,按键移动和按键松开的事件,与其配合达到目的。
这个效果实现了,其实也变相的实现了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;
}
}
});
实现代码
鼠标按下,移动,鼠标松开
先对SkiaSharp对象,增加相关事件
skContainer.MouseDown += SkContainer_MouseDown;
skContainer.MouseUp += SkContainer_MouseUp;
skContainer.MouseMove += SkContainer_MouseMove;
然后增加相关事件处理代码,我这边都统一处理了.
private void SkContainer_MouseDown(object sender, MouseButtonEventArgs e)
{
var cur = e.GetPosition(sender as IInputElement);
drawClock.MouseDown(new SKPoint((float)cur.X, (float)cur.Y), true);
}
private void SkContainer_MouseUp(object sender, MouseEventArgs e)
{
var cur = e.GetPosition(sender as IInputElement);
drawClock.MouseDown(new SKPoint((float)cur.X, (float)cur.Y), false);
}
private void SkContainer_MouseMove(object sender, MouseEventArgs e)
{
var cur = e.GetPosition(sender as IInputElement);
drawClock.MouseMove(new SKPoint((float)cur.X, (float)cur.Y));
}
拖曳核心类
/// <summary>
/// 拖曳
/// </summary>
public class Drag
{
public SKPoint centerPoint;
public int Radius = 0;
private bool Pressed = false;
private bool CirclePressend = false;
private SKPoint sKPoint = SKPoint.Empty;
private SKPoint CirclePoint = SKPoint.Empty;
private SKCanvas canvas;
private float dx = 0;
private float dy = 0;
/// <summary>
/// 渲染
/// </summary>
public void Render(SKCanvas canvas, SKTypeface Font, int Width, int Height)
{
this.canvas = canvas;
centerPoint = new SKPoint(Width / 2, Height / 2);
this.Radius = 40;
canvas.Clear(SKColors.White);
if (CirclePoint.IsEmpty)
{
CirclePoint = new SKPoint(centerPoint.X, centerPoint.Y);
}
if (CirclePressend)
{
CirclePoint = new SKPoint(sKPoint.X - dx, sKPoint.Y - dy);
DrawCircle(this.canvas, CirclePoint);
}
else
{
DrawCircle(this.canvas, CirclePoint);
}
using var paint = new SKPaint
{
Color = SKColors.Black,
IsAntialias = true,
Typeface = Font,
TextSize = 24
};
var msg = $"X:{ sKPoint.X} Y:{sKPoint.Y} Pressed:{Pressed} CirclePressend:{CirclePressend}";
canvas.DrawText(msg, 0, 30, paint);
}
public void MouseMove(SKPoint sKPoint)
{
this.sKPoint = sKPoint;
if (CirclePressend)//按下,就开始拖动
{
CirclePoint = sKPoint;
}
}
public void MouseDown(SKPoint sKPoint, bool Pressed)
{
this.sKPoint = sKPoint;
this.Pressed = Pressed;
if (this.Pressed)
{
this.CirclePressend = CheckPoint(sKPoint, CirclePoint);
if (this.CirclePressend)
{
dx = sKPoint.X - CirclePoint.X;
dy = sKPoint.Y - CirclePoint.Y;
}
}
else
{
this.CirclePressend = false;
}
}
public bool CheckPoint(SKPoint sKPoint, SKPoint CirclePoint)
{
var d = Math.Sqrt(Math.Pow(sKPoint.X - CirclePoint.X, 2) + Math.Pow(sKPoint.Y - CirclePoint.Y, 2));
return this.Radius >= d;
}
/// <summary>
/// 画一个圆
/// </summary>
public void DrawCircle(SKCanvas canvas, SKPoint sKPoint)
{
using var paint = new SKPaint
{
Color = SKColors.Blue,
Style = SKPaintStyle.Fill,
IsAntialias = true,
StrokeWidth = 2
};
canvas.DrawCircle(sKPoint.X, sKPoint.Y, Radius, paint);
}
}
效果如下
我可以点的球的边边哦,这也是一个小技巧,点到球哪里,停止的时候,鼠标还在那个位置,是不是有点像拖动窗体的感觉了。
来源:https://www.cnblogs.com/kesshei/p/16526795.html
标签:WPF,SkiaSharp,拖曳
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Flutter 剪裁组件的使用
2023-06-18 13:15:04
![](https://img.aspxhome.com/file/2023/3/96783_0s.png)
Java定义泛型方法实例分析
2023-11-20 20:28:22
Android Activity与Service通信(不同进程之间)详解
2023-07-16 00:55:34
C#多线程系列之线程完成数
2021-12-24 03:07:47
Spring Boot 员工管理系统超详细教程(源码分享)
2022-04-18 13:32:26
![](https://img.aspxhome.com/file/2023/5/68565_0s.jpg)
C#之set与get方法的用法案例
2021-08-09 01:17:18
![](https://img.aspxhome.com/file/2023/9/88399_0s.jpg)
Java8通过CompletableFuture实现异步回调
2022-07-31 01:43:53
![](https://img.aspxhome.com/file/2023/6/103996_0s.png)
一文搞懂Java中的注解和反射
2022-04-04 20:55:31
你真的知道Java中对象的销毁吗
2022-09-14 22:31:38
Android异步下载图片并且缓存图片到本地DEMO详解
2022-10-27 14:16:17
![](https://img.aspxhome.com/file/2023/5/90165_0s.png)
Android ViewPager实现无限循环效果
2022-03-14 00:15:42
![](https://img.aspxhome.com/file/2023/2/122112_0s.gif)
Android用PopupWindow实现自定义overflow
2021-08-08 22:56:06
![](https://img.aspxhome.com/file/2023/1/116001_0s.jpg)
Java中synchronized锁的深入理解
2023-08-18 01:36:55
![](https://img.aspxhome.com/file/2023/1/64771_0s.webp)
java开发分布式服务框架Dubbo原理机制详解
2023-01-04 19:53:01
![](https://img.aspxhome.com/file/2023/0/71210_0s.png)
从零实现一个简单的Spring Bean容器的代码案例
2022-07-24 11:42:16
C#请求http向网页发送接收数据的方法
2022-05-28 15:39:20
Spring事件Application Event原理详解
2021-10-03 19:43:45
springboot v2.0.3版本多数据源配置方法
2023-07-27 06:37:57
![](https://img.aspxhome.com/file/2023/5/57825_0s.png)
C#中Timer使用及解决重入问题
2022-02-21 00:44:52
![](https://img.aspxhome.com/file/2023/6/102186_0s.png)
C#中类成员的定义的修饰关键词知识点总结
2023-08-13 15:10:10