[UWP]CompositionLinearGradientBrush加BlendEffect,雙倍的快樂

来源:https://www.cnblogs.com/dino623/archive/2019/10/28/CompositionLinearGradientBrush-with-BlendEffect.html
-Advertisement-
Play Games

1. 什麼是BlendEffect 上一篇文章介紹了CompositionLinearGradientBrush的基本用法, 這篇文章再結合BlendEffec介紹一些更複雜的玩法。 命名空間下的 "BlendEffect" 用於組合兩張圖片(分別是作為輸入源的Background和Foregrou ...


1. 什麼是BlendEffect

上一篇文章介紹了CompositionLinearGradientBrush的基本用法, 這篇文章再結合BlendEffec介紹一些更複雜的玩法。

Microsoft.Graphics.Canvas.Effects命名空間下的BlendEffect 用於組合兩張圖片(分別是作為輸入源的Background和Foreground),它包含多種模式,如下圖所示:

其中最簡單的是Screen模式,它的計算公式如下

看起來有點複雜, 我的理解是它相當於色輪中Background和Foreground之間拉直線,在直線的中間點的顏色,如下麵這張圖,紅色和藍色組合成為紫色:

2. 組合CompositionBrush並使用BlendEffect

許多 CompositionBrushes 使用其他 CompositionBrushes 作為輸入。 例如,使用 SetSourceParameter 方法可以將其他 CompositionBrush 設為 CompositionEffectBrush 的輸入。這是CompositionBrush最好玩的地方之一。下麵的例子介紹了怎麼使用BlendEffect創建CompositionBrush。

首先創建兩個CompositionLinearGradientBrush:

var foregroundBrush = compositor.CreateLinearGradientBrush();
foregroundBrush.StartPoint = Vector2.Zero;
foregroundBrush.EndPoint = new Vector2(1.0f);
var redGradientStop = compositor.CreateColorGradientStop();
redGradientStop.Offset = 0f;
redGradientStop.Color = Color.FromArgb(255, 255, 0, 0);
var yellowGradientStop = compositor.CreateColorGradientStop();
yellowGradientStop.Offset = 1f;
yellowGradientStop.Color = Color.FromArgb(255, 0, 178, 255);
foregroundBrush.ColorStops.Add(redGradientStop);
foregroundBrush.ColorStops.Add(yellowGradientStop);


var backgroundBrush = compositor.CreateLinearGradientBrush();
backgroundBrush.StartPoint = new Vector2(0, 1f);
backgroundBrush.EndPoint = new Vector2(1f, 0);
var blueGradientStop = compositor.CreateColorGradientStop();
blueGradientStop.Offset = 0f;
blueGradientStop.Color = Color.FromArgb(255, 0, 0, 255);
var greenGradientStop = compositor.CreateColorGradientStop();
greenGradientStop.Offset = 1f;
greenGradientStop.Color = Color.FromArgb(255, 0, 255, 0);
backgroundBrush.ColorStops.Add(blueGradientStop);
backgroundBrush.ColorStops.Add(greenGradientStop);

它們的效果分別如下麵兩張圖片所示:

接下來創建BlendEffect,並將Foreground和Background設置為CompositionEffectSourceParameter

var blendEffect = new BlendEffect()
{
    Mode = BlendEffectMode.Screen,
    Foreground = new CompositionEffectSourceParameter("Main"),
    Background = new CompositionEffectSourceParameter("Tint"),
};

使用BlendEffect創建Brush,並用SetSourceParameter設置它的Foreground和Background。

var effectFactory = compositor.CreateEffectFactory(blendEffect);
var blendEffectBrush = effectFactory.CreateBrush();
blendEffectBrush.SetSourceParameter("Main", foregroundBrush);
blendEffectBrush.SetSourceParameter("Tint", backgroundBrush);

最後就是一般的使用這個blendEffectBrush的代碼:

//創建SpriteVisual並設置Brush
var spriteVisual = compositor.CreateSpriteVisual();
spriteVisual.Brush = blendEffectBrush;

//將自定義 SpriteVisual 設置為元素的可視化樹的最後一個子元素。
ElementCompositionPreview.SetElementChildVisual(Gradient, spriteVisual);

最終運行效果如下:

3. 創建動畫

和上一篇文章一樣,我也把這篇文章用到的技術用在了一個番茄鐘應用里,,簡單地使用ColorKeyFrameAnimationScalarKeyFrameAnimation製作動畫:

private void StartOffsetAnimation(CompositionColorGradientStop gradientOffset, float offset)
{
    var offsetAnimation = _compositor.CreateScalarKeyFrameAnimation();
    offsetAnimation.Duration = TimeSpan.FromSeconds(1);
    offsetAnimation.InsertKeyFrame(1.0f, offset);
    gradientOffset.StartAnimation(nameof(CompositionColorGradientStop.Offset), offsetAnimation);
}

private void StartColorAnimation(CompositionColorGradientStop gradientOffset, Color color)
{
    var colorAnimation = _compositor.CreateColorKeyFrameAnimation();
    colorAnimation.Duration = TimeSpan.FromSeconds(2);
    colorAnimation.Direction = Windows.UI.Composition.AnimationDirection.Alternate;
    colorAnimation.InsertKeyFrame(1.0f, color);
    gradientOffset.StartAnimation(nameof(CompositionColorGradientStop.Color), colorAnimation);
}

完整代碼在這裡,具體運行效果如下:

4. 結語

上面的動畫可以安裝我的番茄鐘應用試玩一下,安裝地址:

一個番茄鐘

這篇文章的動畫和代碼都參考了JustinLiu的代碼,感謝他的分享。

使用XAML畫筆難以做到這種多向漸變的效果,這都多虧了UWP提供了BlendEffect這個好玩的東西。BlendEffect還有很多其它好玩的模式,大家有空可以多多嘗試。

參考

合成畫筆 - Windows UWP applications _ Microsoft Docs

BlendEffect Class

BlendEffectMode Enumeration

CompositionEffectBrush.SetSourceParameter(String, CompositionBrush) Method (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

CompositionEffectSourceParameter Class (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

源碼

OnePomodoro_GradientsWithBlend.xaml.cs at master


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 【ASP.NET Core學習】基礎知識,配置文件,日誌,依賴註入 ...
  • 動手造輪子:實現一個簡單的依賴註入(一) Intro 在上一篇文章中主要介紹了一下要做的依賴註入的整體設計和大概編程體驗,這篇文章要開始寫代碼了,開始實現自己的依賴註入框架。 類圖 首先來溫習一下上次提到的類圖 服務生命周期 服務生命周期定義: 服務定義 服務註冊定義: 為了使用起來更方便添加了一些 ...
  • 描述:某次更新程式,需要給測試員MM測試,之前都是正常的,更新後給MM測試就報異常System.Net.WebException 基礎連接已經關閉:接收時發生錯誤 > System.IO.IOException: 無法從傳輸連接中讀取數據:你的主機中的軟體中止了一個已建立的連接。 排查第一步:首先用 ...
  • # 導包 首先我們需要導入 MailKit NuGet包,NuGet安裝包命令在下方拓展介紹中。 # 引用命名空間 # 郵件發送幫助類 藉助這一個簡單的郵件發送類我們就可以已經可以實現郵件發送功能了。 # 拓展(NuGet常用命令) 1、安裝指定版本:install-package <程式包名> - ...
  • 場景 SpringBoot+Junit在IDEA中實現查詢資料庫的單元測試: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/92780716 SSM中怎樣使用JUnit4+spring-test編寫單元測試: https://bl ...
  • 很高興地分享一個名稱為Aspose.Tasks for C ++的API全新發佈!Aspose.Tasks(用C ++編寫)旨在與C ++語言一起用於Windows,Linux和UNIX等各種平臺。Aspose.Tasks可以與任何類型的應用程式一起使用,從基於控制台的應用程式到基於桌面的應用程式。 ...
  • 轉自 http://www.hanyeah.com/blog/post/%E5%9B%9B%E9%A1%B6%E7%82%B9%E6%A0%A1%E6%AD%A3%E9%80%8F%E8%A7%86%E5%8F%98%E6%8D%A2%E7%9A%84%E7%BA%BF%E6%80%A7%E6%96... ...
  • VS2019專業版和企業版的密鑰 Visual Studio 2019 EnterpriseBF8Y8-GN2QH-T84XB-QVY3B-RC4DFVisual Studio 2019 ProfessionalNYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y VS2017專業版和企業版的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...