SkiaSharp 之 WPF 自繪時鐘(案例版)

SkiaSharp是一個跨平臺2D圖形API,用于.NET平臺,基于Google's Skia Graphics庫(skia.org網站). 它提供了一個全面的2D API,可以跨移動、服務器和桌面模型來渲染圖像。該圖形庫可實現獲取指定坐標像素值、繪制2d圖形、繪制文字(必須有相應字庫支持)、創建縮略圖等,微軟是大力支持的。

可見此地址:

https://docs.microsoft.com/zh-cn/dotnet/api/skiasharp

首先是想熟悉下SkiaSharp的操作,另外呢,想基于SkiaSharp來做跨平臺的UI渲染器,一直沒有動手,在搜集資料,現在基本搜集的差不多了,所以,就找點例子,學學,也挺有趣的。

一個時鐘的效果

大概是以下的樣子,也挺簡單的,就是對度數是要計算的,用到的方法,也就畫圓和畫路徑以及畫文本幾個方法。

10b5794d819831c57dd49ee412790fcd.png

然后,根據時間,自動轉動時鐘的指針。

自從畢業后,就沒有做過這樣的案例了。但是,上手了,感覺還是很欣喜的。

Wpf 和 SkiaSharp

新建一個WPF項目,然后,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;}}
});

時鐘邏輯

///?<summary>///?一個簡單版的時鐘///?</summary>public?class?DrawClock{public?SKPoint?centerPoint;public?int?Radius?=?0;public?int?HAND_TRUNCATION;public?int?HOUR_HAND_TRUNCATION;public?int?HAND_RADIUS;public?int?TIPS;///?<summary>///?渲染///?</summary>public?void?Render(SKCanvas?canvas,?SKTypeface?Font,?int?Width,?int?Height){centerPoint?=?new?SKPoint(Width?/?2,?Height?/?2);this.Radius?=?(int)(centerPoint.Y?-?50);HAND_TRUNCATION?=?Width?/?25;HOUR_HAND_TRUNCATION?=?Width?/?10;HAND_RADIUS?=?this.Radius?+?15;TIPS?=?this.Radius?-?40;canvas.Clear(SKColors.SkyBlue);DrawCircle(canvas,?Font);DrawCenter(canvas,?Font);DrawHands(canvas,?Font);DrawTimeNumber(canvas,?Font);DrawTips(canvas,?Font);using?var?paint?=?new?SKPaint{Color?=?SKColors.Black,IsAntialias?=?true,Typeface?=?Font,TextSize?=?20};using?var?paint2?=?new?SKPaint{Color?=?SKColors.Blue,IsAntialias?=?true,Typeface?=?Font,TextSize?=?24};string?msg?=?$"{DateTime.Now:yyyy-MM-dd?HH:mm:ss:fff:ffffff}";string?tishi?=?"?WPF?SkiaSharp?自繪時鐘?基礎代碼";string?by?=?$"by?藍創精英團隊";canvas.DrawText(msg,?0,?30,?paint);canvas.DrawText(tishi,?450,?30,?paint);canvas.DrawText(by,?600,?400,?paint2);}///?<summary>///?畫一個圓///?</summary>public?void?DrawCircle(SKCanvas?canvas,?SKTypeface?Font){using?var?paint?=?new?SKPaint{Color?=?SKColors.Black,Style?=?SKPaintStyle.Stroke,IsAntialias?=?true,StrokeWidth?=?2};canvas.DrawCircle(centerPoint.X,?centerPoint.Y,?Radius,?paint);}///?<summary>///?時鐘的核心///?</summary>public?void?DrawCenter(SKCanvas?canvas,?SKTypeface?Font){using?var?paint?=?new?SKPaint{Color?=?SKColors.Black,Style?=?SKPaintStyle.Fill,IsAntialias?=?true,StrokeWidth?=?2};canvas.DrawCircle(centerPoint.X,?centerPoint.Y,?5,?paint);}private?void?DrawHand(SKCanvas?canvas,?SKTypeface?Font,?int?times,?bool?isHour?=?false){var?angle?=?Math.PI?*?2?*?(times?/?(double)60)?-?Math.PI?/?2;var?handRadius?=?isHour???this.Radius?-?HAND_TRUNCATION?-?HOUR_HAND_TRUNCATION?:?this.Radius?-?HAND_TRUNCATION;using?var?paint?=?new?SKPaint{Color?=?(DateTimeOffset.Now.Second?%?4?<=?1)???SKColors.Red?:?SKColors.Green,Style?=?SKPaintStyle.Fill,StrokeWidth?=?2,IsStroke?=?true,StrokeCap?=?SKStrokeCap.Round,IsAntialias?=?true};var?path?=?new?SKPath();path.MoveTo(centerPoint);path.LineTo((float)(centerPoint.X?+?Math.Cos(angle)?*?handRadius),?(float)(centerPoint.Y?+?Math.Sin(angle)?*?handRadius));path.Close();canvas.DrawPath(path,?paint);}///?<summary>///?畫時針///?</summary>public?void?DrawHands(SKCanvas?canvas,?SKTypeface?Font){var?time?=?DateTime.Now;var?hour?=?time.Hour?>?12???time.Hour?-?12?:?time.Hour;DrawHand(canvas,?Font,?hour?*?5?+?time.Minute?/?60?*?5,?true);DrawHand(canvas,?Font,?time.Minute,?false);DrawHand(canvas,?Font,?time.Second,?false);}///?<summary>///?畫時間點///?</summary>public?void?DrawTimeNumber(SKCanvas?canvas,?SKTypeface?Font){using?var?paint?=?new?SKPaint{Color?=?SKColors.Black,IsAntialias?=?true,Typeface?=?Font,TextSize?=?24};for?(int?i?=?1;?i?<=?12;?i++){var?angle?=?Math.PI?/?6?*?(i?-?3);var?number?=?i.ToString();var?numberTextWidth?=?paint.MeasureText(number);canvas.DrawText(number,?(float)(centerPoint.X?+?Math.Cos(angle)?*?HAND_RADIUS?-?numberTextWidth?/?2),?(float)(centerPoint.Y?+?Math.Sin(angle)?*?HAND_RADIUS?+?24?/?3),?paint);}}///?<summary>///?畫提示信息///?</summary>public?void?DrawTips(SKCanvas?canvas,?SKTypeface?Font){using?var?paint?=?new?SKPaint{Color?=?SKColors.Black,IsAntialias?=?true,Typeface?=?Font,TextSize?=?20};var?now?=?DateTime.Now;//年月日var?Date?=?$"{now.Year}/{now.Month}/{now.Day}";var?DateTextWidth?=?paint.MeasureText(Date);var?angle?=?Math.PI?/?6?*?(6?-?3);canvas.DrawText(Date,?(float)(centerPoint.X?+?Math.Cos(angle)?*?TIPS?-?DateTextWidth?/?2),?(float)(centerPoint.Y?+?Math.Sin(angle)?*?TIPS),?paint);//PM?AMvar?amOrPm?=?now.Hour?>?12???"PM"?:?"AM";var?amOrPmTextWidth?=?paint.MeasureText(amOrPm);var?angle2?=?Math.PI?/?6?*?(12?-?3);canvas.DrawText(amOrPm,?(float)(centerPoint.X?+?Math.Cos(angle2)?*?TIPS?-?amOrPmTextWidth?/?2),?(float)(centerPoint.Y?+?Math.Sin(angle2)?*?TIPS),?paint);}}

運行結果

f75fa6646400cf29e0170c193e35398e.gif

總結

這個錄的GIF播放效果真不錯,基本體現出來了效果。

也算是入門了,后期,可以基于SkiaSharp,做更多的案例,出來,當然,還是基于自繪的實現。

代碼地址

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

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

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

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

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

相關文章

推薦一簡單易用的腦圖制作工具

幕布是什么&#xff1f; 大綱文檔工具&#xff0c;管理你的大腦層級折疊文字&#xff0c;結構化思考助手一鍵轉換思維導圖并編輯&#xff0c;效率翻倍幕布可以做什么&#xff1f; 大綱筆記&#xff0c;思維整理 學習筆記清單工具 管理日程管理待辦購物清單等等內容創作會議記錄…

自動性能統計信息(三)(Automatic Performance Statistics)

1.3 管理自動工作負載庫&#xff08;AWR&#xff09;本節講述如何管理AWR&#xff0c;包含以下主題&#xff1a; 管理快照 管理基線 管理基線模板 傳輸自動工作負載庫數據 使用自動工作負載庫視圖 生成AWR報告 生成AWR對比報告 生成ASH報告 …

su: user tomcat does not exist

http://www.cnblogs.com/allegro/p/5005352.html 問題在于 你的startup.sh 里面設置了 用戶,你需要修改為root或者tomcat用戶 這是開發 遷移碰到的問題 test ".$TOMCAT_USER" . && TOMCAT_USERtomcat # Set JAVA_HOME to working JDK or JRE # JAVA_HOME/op…

【QGIS入門實戰精品教程】4.5:QGIS打開Excel中的點坐標,并生成矢量文件

QGIS中可以很方便添加Excel或其他文本格式的點坐標,并將其轉為矢量等多種格式的文件。 擴展閱讀: 【ArcGIS風暴】ArcGIS 10.2導入Excel數據X、Y坐標(經緯度、平面坐標),生成Shapefile點數據圖層 文章目錄 1. 數據準備2. 添加數據3. 保存文矢量文件1. 數據準備 本實驗使用…

[NOI2014]起床困難綜合癥

從高位往地位貪心即可 # include <bits/stdc.h> # define IL inline # define RG register # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; const int _(1e5 10);IL ll Read(){RG char c getchar(); RG ll x 0, z 1;for(;…

騰訊云EKS 上部署 eshopondapr

騰訊云容器服務&#xff08;Tencent Kubernetes Engine&#xff0c;TKE&#xff09;基于原生 kubernetes 提供以容器為核心的、高度可擴展的高性能容器管理服務。騰訊云容器服務完全兼容原生 kubernetes API &#xff0c;擴展了騰訊云的云硬盤、負載均衡等 kubernetes 插件&…

[轉]一往無前 | 小米十周年,雷軍公開演講全文

2020年8月11日19:30&#xff0c;小米十周年&#xff0c;雷軍公開演講如約而至。在近3小時的演講中&#xff0c;雷軍用20個故事回顧了小米過去的熱血10年&#xff0c;也展望了新的10年&#xff1a; - 創新之火將會照亮每個瘋狂的想法&#xff0c;小米將成為工程師向往的圣地。 -…

JAVA單例之我見

為什么80%的碼農都做不了架構師&#xff1f;>>> 單例模式作為設計模式中最簡單的一種&#xff0c;是一個被說爛了的東西。但是在項目中還是會發現關于單例模式的一些錯誤實現&#xff0c;可見單例也并不是我們想象的那么簡單。最近陸陸續續看了幾篇關于單例的博客&…

「劉一哥GIS」系列專欄《QGIS入門實戰精品教程(配套案例數據)》

「劉一哥GIS」系列專欄《QGIS入門實戰精品教程&#xff08;配套案例數據&#xff09;》全新上線了&#xff0c;歡迎廣大GISer朋友關注&#xff0c;一起探索GIS奧秘&#xff0c;分享GIS價值&#xff01; 本專欄以實戰案例的形式&#xff0c;深入淺出地介紹了QGIS的基本使用方法&…

MyEclipse的Git配置

1.下載&#xff1a;git的插件egit 并解壓 插件 下載地址&#xff1a;http://www.eclipse.org/egit/download/ 所有版本&#xff1a;http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of_EGit.3F 2.在MyEclipse安裝目錄下的dropins文件夾下創建egit文件夾 3.…

ASP.NET Core 定時刷新第三方 Token

前言在《ASP.NET Core 自動刷新JWT Token》中我們實現了為客戶端自動提供最新的Token。但是&#xff0c;當我們的 ASP.NET Core 應用需要調用第三方 API 時&#xff0c;如何更優雅地刷新第三方提供的 Token 呢&#xff1f;思路我們可以在啟動時就獲取第三方提供的 Token 并保存…

VSCode 插件開發實例(WebView):微信讀書 ^-^邊擼代碼邊看小說^-^

最終效果 主要代碼 package.json {"name": "WeReadForVSCodeJackieZheng","repository": {"type": "git","url": "https://github.com/JackieZheng/WeReadForVSCode.git"},"displayName": &q…

【QGIS入門實戰精品教程】4.7:QGIS如何將矢量數據轉為GeoJSON格式?

本文以案例的形式,講述在QGIS專業軟件中,將矢量數據轉為GeoJSON的方法。 擴展閱讀: 【ArcGIS風暴】如何將矢量數據(點、線、面)折點坐標轉為GeoJSON格式? 在QGIS中,可以直接將數據導出為GeoJSON格式。具體操作方法是:右鍵矢量數據圖層→導出圖層→到文件,如下圖所示:…

Git的純命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤銷更新,分支的創建/切換/更新/提交/合并,代碼沖突...

Git的純命令操作&#xff0c;Install&#xff0c;Clone , Commit&#xff0c;Push&#xff0c;Pull&#xff0c;版本回退&#xff0c;撤銷更新&#xff0c;分支的創建/切換/更新/提交/合并&#xff0c;代碼沖突 這篇是接著上篇分布式版本庫——Windows下Git的環境部署以及在Git…

掌握jQuery插件開發

在實際開發工作中&#xff0c;總會碰到像滾動&#xff0c;分頁&#xff0c;日歷等展示效果的業務需求&#xff0c;對于接觸過jQuery以及熟悉jQuery使用的人來說&#xff0c;首先想到的肯定是尋找現有的jQuery插件來滿足相應的展示需求。目前頁面中常用的一些組件&#xff0c;都…

List 分頁加載數據控制機制

分頁加載是一種應用很廣泛的數據展示控制機制&#xff0c;相信絕大多數開發者對于這一套機制都非常熟悉。這篇文章的主要目的結合實際的使用場景&#xff0c;對以往在開發中遇到一些概念進行梳理&#xff0c;歸納的同時加深理解&#xff0c;也希望能幫助更多剛剛接觸到開發的同…

【QGIS入門實戰精品教程】3.3:QGIS如何打開ArcGIS創建的文件數據庫(GDB)?

在行業應用中,GIS地理空間數據往往存儲在ESRI ArcGIS的文件地理數據庫(File GeodataBase),因此,ArcGIS與QGIS的數據交互、共享就顯得非常重要。QGIS3可以直接打開File GDB數據,并對數據進行顯示、查看、處理等操作。具體的步驟如下: 相關閱讀:【QGIS入門實戰精品教程】3…

.NET 6 Linux 系統服務 Systemd (案例版)

.Net Core Windows 系統服務&#xff0c;之前已經寫過了&#xff0c;但是&#xff0c;對于Linux的系統服務&#xff0c;卻沒有寫過&#xff0c;主要是因為&#xff0c;大部分Linux的.Net服務都直接Docker了&#xff0c;當然&#xff0c;不排除有這種使用的&#xff0c;可能搞成…

封裝一個Array 數據 綁定 html select 方法

/** * * param {} select select控件 * param {} nodes Array數據 * param {} value value綁定項 * param {} text text綁定項 * param {} prompt 選擇提示信息 * returns {} */ function bindSelect(select, nodes, value, text, prompt) {select.empty();if (prom…

XmlParser和HtmlParser

經常要用的Xml和Html解決&#xff0c;實際上這個領域也有非常好的解決方案。 相對來說現在各種開源的Xml解析功能比較豐富&#xff0c;機制也比較靈活&#xff0c;但是由于他功能比較完善&#xff0c;干的事情比較多&#xff0c;所以性能方面也慢一點&#xff1b;另外&#xff…