SkiaSharp 之 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?Radius?{?get;?set;?}public?bool?Dragged?{?get;?set;?}?=?false;public?SKColor?sKColor?{?get;?set;?}?=?SKColors.Blue;public?bool?CheckPoint(SKPoint?sKPoint){var?d?=?Math.Sqrt(Math.Pow(sKPoint.X?-?X,?2)?+?Math.Pow(sKPoint.Y?-?Y,?2));return?this.Radius?>=?d;}
}

五環彈動核心類 (FiveRings.cs)

///?<summary>
///?五環彈球
///?</summary>
public?class?FiveRings
{public?SKPoint?centerPoint;public?int?Radius?=?0;public?int?BallLength?=?8;public?double?TargetX;public?double?Spring?=?0.03;public?double?SpringLength?=?200;public?double?Friction?=?0.95;public?List<Ball>??Balls;public?Ball??draggedBall;public?void?init(SKCanvas?canvas,?SKTypeface?Font,?int?Width,?int?Height){if?(Balls?==?null){Balls?=?new?List<Ball>();for?(int?i?=?0;?i?<?BallLength;?i++){Random?random?=?new?Random((int)DateTime.Now.Ticks);Balls.Add(new?Ball(){X?=?random.Next(50,?Width?-?50),Y?=?random.Next(50,?Height?-?50),Radius?=?this.Radius});}}}///?<summary>///?渲染///?</summary>public?void?Render(SKCanvas?canvas,?SKTypeface?Font,?int?Width,?int?Height){centerPoint?=?new?SKPoint(Width?/?2,?Height?/?2);this.Radius?=?20;this.TargetX?=?Width?/?2;init(canvas,?Font,?Width,?Height);canvas.Clear(SKColors.White);//劃線using?var?LinePaint?=?new?SKPaint{Color?=?SKColors.Green,Style?=?SKPaintStyle.Fill,StrokeWidth?=?3,IsStroke?=?true,StrokeCap?=?SKStrokeCap.Round,IsAntialias?=?true};SKPath?path?=?null;foreach?(var?item?in?Balls){if?(path?==?null){path?=?new?SKPath();path.MoveTo((float)item.X,?(float)item.Y);}else{path.LineTo((float)item.X,?(float)item.Y);}}path.Close();canvas.DrawPath(path,?LinePaint);foreach?(var?item?in?Balls){if?(!item.Dragged){foreach?(var?ball?in?Balls.Where(t?=>?t?!=?item).ToList()){SpringTo(item,?ball);}}DrawCircle(canvas,?item);}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.Radius,?paint);}public?void?MouseMove(SKPoint?sKPoint){if?(draggedBall?!=?null){draggedBall.X?=?sKPoint.X;draggedBall.Y?=?sKPoint.Y;}}public?void?MouseDown(SKPoint?sKPoint){foreach?(var?item?in?Balls){if?(item.CheckPoint(sKPoint)){item.Dragged?=?true;draggedBall?=?item;}else{item.Dragged?=?false;}}}public?void?MouseUp(SKPoint?sKPoint){draggedBall?=?null;foreach?(var?item?in?Balls){item.Dragged?=?false;}}public?void?SpringTo(Ball?b1,?Ball?b2){var?dx?=?b2.X?-?b1.X;var?dy?=?b2.Y?-?b1.Y;var?angle?=?Math.Atan2(dy,?dx);var?targetX?=?b2.X?-?SpringLength?*?Math.Cos(angle);var?targetY?=?b2.Y?-?SpringLength?*?Math.Sin(angle);b1.VX?+=?(targetX?-?b1.X)?*?Spring;b1.VY?+=?(targetY?-?b1.Y)?*?Spring;b1.VX?*=?Friction;b1.VY?*=?Friction;b1.X?+=?b1.VX;b1.Y?+=?b1.VY;}
}

效果如下:

68b87318e5d56d2d9ddc196544bcf5df.gif

這個特效用的好,也能產生一些神奇的效果。

總結

這次是結合拖曳和彈動效果實現的綜合案例,效果還是很不錯的,之前也沒想到原來還可以這樣玩,拓展了玩法啊。

代碼地址

https://github.com/kesshei/WPFSkiaFiveRingsDemo.git

https://gitee.com/kesshei/WPFSkiaFiveRingsDemo.git

一鍵三連呦!,感謝大佬的支持,您的支持就是我的動力!

版權

藍創精英團隊(公眾號同名,CSDN同名,CNBlogs同名)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284141.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【GlobalMapper精品教程】032:瀏覽地理照片及航線信息(航測應用)

本文講述globalmapper軟件在無人機航測了內業處理中的應用之:瀏覽地理照片及航線信息、相機參數、元數據編輯器。 文章目錄 1. 航線信息瀏覽2. 地理圖像瀏覽2.1 數字化工具2.2 要素信息工具2.3 屬性表3. 照片原數據編輯1. 航線信息瀏覽 打開globalmapper軟件,加載無人機航測…

Spring Boot 2.7.0發布,2.5停止維護

這幾天是Spring版本日&#xff0c;很多Spring工件都發布了新版本&#xff0c; Spring Framework 6.0.0 發布了第 4 個里程碑版本&#xff0c;此版本包含所有針對 5.3.20 的修復補丁&#xff0c;以及特定于 6.0 分支的 39 項修復和改進。而今天Spring Boot 2.7.0和Spring Securi…

【GlobalMapper精品教程】031:Globalmapper在航測內業數據處理中的應用舉例

Globalmapper在航測內業數據處理中的應用舉例索引。 文章目錄 1. 圖像及航線瀏覽2. 3D重建3. 點云分類4. 創建地形5. 地形分析1. 圖像及航線瀏覽 擴展閱讀:【GlobalMapper精品教程】032:瀏覽地理照片及航線信息(航測應用) 2. 3D重建 從Global Mapper的19版本開始,Pixels-…

移動工具V和選區工具M

移動工具快捷鍵&#xff1a;V 屬性&#xff1a; 自動選擇 在默認情況下&#xff0c;移動工具的“自動選擇”一項是沒有勾選的。表示只能選中圖層窗口中選定的固定圖層&#xff0c;不能隨意的點擊選擇別的圖層。在這里&#xff0c;我們也勾選“自動選擇”&#xff0c;可任意選擇…

SeleniumWebDriver擴展插件開發

Selenium WebDriver 是一組開源 API&#xff0c;用于自動測試 Web 應用程序&#xff0c;利用它可以通過代碼來控制chrome edge等瀏覽器&#xff01;有時候我們需要mock接口的返回&#xff0c;或者攔截和轉發請求&#xff0c;今天就來實現這個功能本插件代碼已開源&#xff1a;h…

ZooKeeper的工作原理

ZooKeeper是一個分布式的應用程序協調服務。 2 ZooKeeper的工作原理 Zookeeper 的核心是原子廣播&#xff0c;這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab(Zookeeper Atomic Broadcast)協議。Zab協議有兩種模式&#xff0c;它們分別是恢復模式&#xff08;…

memcache的學習路線圖

memcache學習材料//memcache自帶的github 上的 wiki//席劍飛 Memcache&#xff08;MC&#xff09;系列 1~8系列評注&#xff1a; memcache系統寫的最深的一博客&#xff0c;建議一讀。http://blog.csdn.net/xifeijian/article/details/21994941//mysql與memcache的使用https://…

[轉]錢嶺:別擔心“35歲危機”,要成為“老專家”

從清華大學到貝爾實驗室&#xff0c;再到中國移動&#xff0c;作為“IT老人”&#xff0c;錢嶺的技術人生幾乎覆蓋了20世紀90年代至今的信息產業革命。2007年開始&#xff0c;錢嶺在中國移動經歷了基礎科研到產品落地&#xff0c;再到團隊孵化&#xff1b;也經歷了云計算從無到…

【GIS前沿】周成虎院士:GIS的大數據時代展望(PPT分享)

本文源自微信公眾號&#xff1a;宋關福GIS筆記。版權歸原作者及刊載媒體所有&#xff0c;如有侵權請立即與我們聯系,我們將及時處理。更多GIS前言技術&#xff0c;請關注《GIS前言》專欄。 GIS的大數據時代展望

DataV:可視化大屏展示神器實戰分享

由于公司年即將發布新的產品&#xff0c;傳統意義上的PPT顯得不太生動化&#xff0c;所以想采用具體化&#xff0c;可視化的數據大屏進行業務數據的事實展示&#xff0c;第一時間想到了來自于阿里云旗下的DataV&#xff0c;廢話不多說&#xff0c;老司機開始發牌照&#xff01;…

數據庫性能系列之索引(中)

GOOD NIGHT前言上一篇中&#xff0c;我們已經了解到了索引的基本概念和一些用法。那索引為什么會提升查詢的速度&#xff0c;以及索引究竟是怎么工作的呢&#xff1f;也許大家心里還是有一些迷茫&#xff0c;這一切&#xff0c;還要從索引背后的算法說起。GOOD NIGHT概述大家知…

微服務架構的設計原則和核心話題

目錄 一、前言 二、微服務架構的設計原則 1.拆分足夠微 2.輕量級通信 3.單一職責原則 4.領域驅動原則 三、微服務架構的核心話題 1.服務拆分 2.服務注冊與發現 3.負載均衡 4.API網關 5.服務部署與發布 四、總結 一、前言 毫無疑問&#xff0c;微服務架構的設計原…

4.3.2 基于集合的操作

在SQL Server處理select命令時&#xff0c;會在內存中建立一個結構&#xff0c;以返回結果集。這個結構實質上是一個有行和列的二維數組&#xff0c;稱為“游標&#xff08;cursor&#xff09;”。“游標”這個詞是“CURrent set of Records(當前記錄集)”的縮寫。它表示從表或…

Golang GOPATH 包

2019獨角獸企業重金招聘Python工程師標準>>> Golang GOPATH & 包的定義 & 包的導入 GOPATH 設置 go 命令依賴一個重要的環境變量&#xff1a;$GOPATH 可以在 .zshrc 配置文件中加上一行這樣的配置&#xff0c; export GOPATH/Users/flyme/mygo Go從1.1版本到…

PPK大疆無人機應用教程

文章目錄 一、新建項目二、導入數據三、解算過程四、結果導出一、新建項目 新建工程,設置項目名稱,保存位置,控制等級,坐標系統(坐標系統選擇高斯克呂格,中央子午線根據實際數據所在位置進行選擇) 二、導入數據 選擇大疆數據,找到對應的文件夾 數據有:圖片,EVENT.b…

Eclipse Add generated serial version ID報錯解決方案

為什么80%的碼農都做不了架構師&#xff1f;>>> 問題&#xff1a; The following problem occurred:Could not find class file.Make sure the file is compilable 解決方案&#xff1a; 1、右鍵項目 -> Java Build Path -> Source 在Sourcd folders on bui…

開啟線程的方式

1、實現Runnable接口 1 package test;2 3 4 5 public class ThreadTest implements Runnable{6 public void tt(){7 Thread t new Thread(this);8 t.start();9 } 10 11 Override 12 public void run() { 13 while(true){ 14 …

C# WPF設備監控軟件(經典)-上篇

01—前言應老東家也是老同學的需求&#xff0c;開發了此設備監控軟件。主要是為了應對測試設備長時間不上傳測試數據未能及時發現的問題&#xff0c;測試數據一般在每臺設備都有個固定的臨時存放目錄&#xff0c;測試數據不更新時&#xff0c;此文件夾便不再更新。需求相對比較…

[轉]微服務的4個設計原則和19個解決方案

目錄 一、微服務架構演進過程 二、微服務架構的好處 三、微服務應用4個設計原則 1.AKF拆分原則 2.前后端分離 3.無狀態服務 4.Restful通信風格 四、微服務架構帶來的問題 五、微服務平臺的19個落地實踐 1.企業IT建設的三大基礎環境 2.微服務應用平臺總體架構 3.微服…

時間處理總結(二)oracle

不斷總結中................. 1.等于land.djsjto_date(2016/7/26,yyyy-MM-dd)2.大于等于land.djsj>to_date(2016/7/26,yyyy-MM-dd)3.小于等于land.djsj<to_date(2016/7/26,yyyy-MM-dd)4.區間land.djsj>to_date(2016/7/26,yyyy-MM-dd) and land.djsj<to_date(2016/7…