MAUI 自定義繪圖入門

来源:https://www.cnblogs.com/lindexi/archive/2022/06/06/16349535.html
-Advertisement-
Play Games

AAAA AAAA即認證、授權、審計、賬號(Authentication、Authorization、Audit、Account)。在安全領域我們繞不開的兩個問題: 授權過程可靠:讓第三方程式能夠訪問所需資源又不泄露用戶數據,常用的多方授權協議主要有 OAuth2 和 SAML 2.0 授權結果可控 ...


在2022的5月份,某軟正式發佈了 MAUI 跨平臺 UI 框架。我本來想著趁六一兒童節放假來寫幾篇關於 MAUI 入門的博客,可惜發現我不擅長寫很入門的博客。再加上 MAUI 似乎是為了趕發佈日期而發佈,只能勉強說能開發了,能用了。於是我就來開始假定大家是一個成熟的 MAUI 開發者了,開始進入複雜控制項自繪的自定義繪圖渲染的博客

在 MAUI 裡面,預設將會在 Microsoft.Maui.Dependencies 引用 Microsoft.Maui.Graphics 的負載。在 Microsoft.Maui.Graphics 里,提供了跨平臺的獨立繪圖能力,在 GitHub 上作為獨立的開源項目,開源在 https://github.com/dotnet/Microsoft.Maui.Graphics

也如 Microsoft.Maui.Graphics 在它開源項目裡面描述的一樣,使用 Microsoft.Maui.Graphics 不會被局限於 MAUI 框架上,可以在任何的應用框架下使用上 Microsoft.Maui.Graphics 庫,就和其他的 NuGet 包一樣去使用。換句話說,我可以在 WPF 或 WinForms 或者是純控制台裡面使用 Microsoft.Maui.Graphics 進行繪圖

另外,我也可以自己註入 Microsoft.Maui.Graphics 的實現定義,擴展其他渲染引擎或框架作為繪圖的基礎支持

回到主題,本文將告訴大家如何在 MAUI 裡面使用 Microsoft.Maui.Graphics 提供的繪圖能力進自繪。對於任何的 UI 框架來說,只要能實現好的自繪,就能擴展出超級多炫酷的界面效果,同時也可以方便將舊技術積累遷移到此 UI 框架上。無疑,在MAUI上就實現了這一點

這部分的內容,在當前是 2022.06 還沒有多少文檔,官方的文檔裡面都說 MAUI 還是預覽版,別聽官方說的,在5月就發佈了。發佈在 6.0.312 的 dotnet 版本上

在 MAUI 裡面接入 Microsoft.Maui.Graphics 從而實現自繪是有框架層的支持的,只是實現的方式稍微有點繞

先安裝 VisualStudio 2022 預覽版用於新建 MAUI 項目。由於 MAUI 的發佈和 VisualStudio 的發佈日期對不上,現在只能通過預覽版本了,不過後續會合入到正式版本

在新建的項目裡面,新建一個類型,讓這個類型繼承 Microsoft.Maui.Graphics.IDrawable 介面。於是此類型即可通過實現 Draw 方法,被框架層調用到,從而在 Draw 方法裡面執行繪圖。例如和官方的例子一樣,將此類型命名為 GraphicsDrawable 如以下代碼

public class GraphicsDrawable : IDrawable
{
    public void Draw(ICanvas canvas, RectF dirtyRect)
    {
    }
}

在 Draw 裡面通過 DrawLine 畫出一段線條。為了讓線條可見,再加上設置線條的顏色和粗細值的代碼

    public void Draw(ICanvas canvas, RectF dirtyRect)
    {
        canvas.StrokeColor = Colors.Red;
        canvas.StrokeSize = 6;
        canvas.DrawLine(10, 10, 90, 100);
    }

完成了這一步之後,還需要將 GraphicsDrawable 接入到 MAUI 框架裡面

在 MAUI 框架里提供了 GraphicsView 元素用來對接 Microsoft.Maui.Graphics 的繪圖功能。在 GraphicsView 的 Drawable 屬性裡面,就是用來傳入 IDrawable 的對象的

對接的第一步是將咱寫的 GraphicsDrawable 類型定義成資源,方便後續代碼都在 XAML 裡面實現。為了演示方便,以下代碼都寫在 MainPage.xaml 里

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:HejawrawceaJurheakelerela"
             x:Class="HejawrawceaJurheakelerela.MainPage">
    <ContentPage.Resources>
        <local:GraphicsDrawable x:Key="GraphicsDrawable"></local:GraphicsDrawable>
    </ContentPage.Resources>

</ContentPage>

還請將以上代碼的 local 的命名空間更換為你的項目對應的命名空間

接著在 GraphicsView 里使用以上定義的資源,如以下代碼

    <GraphicsView x:Name="GraphicsView" WidthRequest="100" HeightRequest="100" Drawable="{StaticResource GraphicsDrawable}"></GraphicsView>

運行程式,即可看到界面畫出一條線

可以看到調用堆棧如下

也就是實際的實現是由 Win2D 提供的

以上是在 Windows 平臺上運行的,那既然 MAUI 宣稱是跨平臺的,那在其他的平臺上又是如何

接下來在安卓平臺上跑一下

同樣也看一下調用堆棧

可以看到調用堆棧和 Windows 平臺上,符合預期的不同,也就是說 Microsoft.Maui.Graphics 根據不同的平臺選用不同的繪製底層技術

這就是 MAUI 自繪的開始,如何繪製出漂亮的界面就靠大家發揮

試用了幾天的 MAUI 發現了比上次我用預覽版本有了很大的進步,比如 Windows 端的調試部署極大的提升。當然,這不是 MAUI 團隊的努力,而是 Windows App SDK 團隊的努力,將原本的 UWP 很多逗比邏輯和交互給優化的。自然,不足之處也是有的,那就是 MAUI 團隊還是太小了,好多東西還沒磨完,不過這會隨著開發的投入逐步完善。現在的 MAUI 已經達到了 Demo 級,小工具級可用的狀態。推薦大家要是有什麼小工具,選擇一下 MAUI 試試水也不錯

本文代碼放在githubgitee 歡迎訪問

可以通過如下方式獲取本文的源代碼,先創建一個空文件夾,接著使用命令行 cd 命令進入此空文件夾,在命令行裡面輸入以下代碼,即可獲取到本文的代碼

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 2da0315302ae504f50c4c3baa47fe3f45d0cdc26

以上使用的是 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

獲取代碼之後,進入 HejawrawceaJurheakelerela 文件夾

博客園博客只做備份,博客發佈就不再更新,如果想看最新博客,請到 https://blog.lindexi.com/

知識共用許可協議
本作品採用知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發佈,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我[聯繫](mailto:[email protected])。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 能夠實現Nacos安裝 基於Nacos能實現應用負載均衡 能基於Nacos實現配置管理 配置管理 負載均衡 多環境切換 配置共用 配置刷新 灰度發佈 掌握Nacos集群部署 1 Nacos安裝 Nacos是Alibaba微服務生態組件中的重要組件之一,主要用它實現應用的動態服務發現、配置管理、服務管 ...
  • 一、說明 return一直中,每中語言中其沒沒有很大差別,就不多說了。(shell語言return的是退出狀態,可能差別是比較大的) 最早看到yield應該是哪們語言用來調整什麼線程優先順序的,記不清了,不過那裡的yield和python中的yield應該功能有區別。 python中最早看到yield ...
  • Lucene、solr以及elasticsearch之間的區別和聯繫 lucene,就是一個jar包,裡面包含了封裝好的各種建立倒排索引、以及進行搜索的代碼,包括各種演算法。我們就用java開發的時候,引入lucene jar,然後基於lucene的api去進行開發就可以了。solr和elastics ...
  • 在本文中,我們將看到Prometheus監控技術棧的局限性,以及為什麼移動到基於Thanos的技術棧可以提高指標留存率並降低總體基礎設施成本。 用於此演示的內容可以在下麵鏈接中獲取,並提交到他們各自的許可證。 https://github.com/particuleio/teks/tree/main ...
  • Java是編譯型語言還是解釋型語言 答案:java既是編譯型語言,也是解釋型語言。 你可以說它是編譯型的。因為所有的Java代碼都需要經過javac編譯為.class文件,但主要是由於java現在擁有了jit,會將熱點代碼的.class文件直接編譯為二進位本地代碼。 你可以說它是解釋型的。因為jav ...
  • 運算符重載 運算符重載基礎 函數重載(Function Overloading)可以讓一個函數名有多種功能,在不同情況下進行不同的操作。**運算符重載(Operator Overloading)**也是一個道理,同一個運算符可以有不同的功能。 例子:用+號實現複數加法運算;成員函數重載運算符 #in ...
  • Python文本分析“王心凌”彈幕演示案例,包含步驟:爬蟲+情感判定+情感占比餅圖+Top10高頻詞+詞雲圖。 ...
  • .NET CORE webapi 調用阿裡雲簡訊服務 1.獲取AccessKey 您可以為阿裡雲賬號(主賬號)和RAM用戶創建一個訪問密鑰(AccessKey)。在調用阿裡雲API時您需要使用AccessKey完成身份驗證。 背景信息 AccessKey包括AccessKey ID和AccessKe ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...