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);
   }
}

效果如下

WPF+SkiaSharp实现自绘拖曳小球

我可以点的球的边边哦,这也是一个小技巧,点到球哪里,停止的时候,鼠标还在那个位置,是不是有点像拖动窗体的感觉了。

来源:https://www.cnblogs.com/kesshei/p/16526795.html

标签:WPF,SkiaSharp,拖曳
0
投稿

猜你喜欢

  • Flutter 剪裁组件的使用

    2023-06-18 13:15:04
  • 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
  • C#之set与get方法的用法案例

    2021-08-09 01:17:18
  • Java8通过CompletableFuture实现异步回调

    2022-07-31 01:43:53
  • 一文搞懂Java中的注解和反射

    2022-04-04 20:55:31
  • 你真的知道Java中对象的销毁吗

    2022-09-14 22:31:38
  • Android异步下载图片并且缓存图片到本地DEMO详解

    2022-10-27 14:16:17
  • Android ViewPager实现无限循环效果

    2022-03-14 00:15:42
  • Android用PopupWindow实现自定义overflow

    2021-08-08 22:56:06
  • Java中synchronized锁的深入理解

    2023-08-18 01:36:55
  • java开发分布式服务框架Dubbo原理机制详解

    2023-01-04 19:53:01
  • 从零实现一个简单的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
  • C#中Timer使用及解决重入问题

    2022-02-21 00:44:52
  • C#中类成员的定义的修饰关键词知识点总结

    2023-08-13 15:10:10
  • asp之家 软件编程 m.aspxhome.com