Flutter 小技巧之:實現 iOS 26 的 “液態玻璃”

隨著 iOS 26 發布,「液態玻璃」無疑是熱度最高的標簽,不僅僅是因為設計風格大變,更是因為 iOS 26 beta1 的各種 bug 帶來的毛坯感讓 iOS 26 沖上熱搜,比如通知中心和控制中心看起來就像是一個半成品:

當然,很多人可能說,不就是一個毛玻璃效果嗎?實際上還真有些不大一樣,特別是不同控件的“模糊”和“液態”效果都不大一樣,效果好不好看一回事,但是液態玻璃確實不僅僅只是一個模糊圖層,至少從下面這個鎖屏效果可以看到它類似液態的扭曲變化:

image-20250612150709296

所以,在實現上就不可能只是一個簡單的 blur ,類似效果肯定是需要通過自定義著色器實現,而恰好在 shadertoy 就有人發布了類似的實現,可以比較方便移植到 Flutter :

針對這個 shader ,其中 LiquidGlass 部分是實現磨砂玻璃效果的核心:

  • vec2 radius = size / R; 計算模糊的半徑,將其從像素單位轉換為標準化坐標。

  • vec4 color = texture(tex, uv); 獲取當前像素 uv 處的原始顏色

  • for (float d = 0.0; d < PI; d += PI / direction): 外層循環,確定采樣的方向,從 0 到 180 度進行迭代。

  • for (float i = 1.0 / quality; i <= 1.0; i += 1.0 / quality) 內層循環,沿著當前方向 d 進行多次采樣, quality 越高,采樣點越密集

  • color += texture(tex, uv + vec2(cos(d), sin(d)) * radius * i); 在當前像素周圍的圓形區域內進行采樣, vec2(cos(d), sin(d)) 計算出方向向量,radius * i 確定了沿該方向的采樣距離,通過累加這些采樣點的顏色,實際上是在對周圍的像素顏色進行平均

  • color /= (quality * direction + 1.0); 將累加的顏色值除以總采樣次數(以及原始顏色),得到平均顏色,這個平均過程就是實現模糊效果的過程

vec4 LiquidGlass(sampler2D tex, vec2 uv, float direction, float quality, float size) {vec2 radius = size / R;vec4 color = texture(tex, uv);for (float d = 0.0; d < PI; d += PI / direction) {for (float i = 1.0 / quality; i <= 1.0; i += 1.0 / quality) {color += texture(tex, uv + vec2(cos(d), sin(d)) * radius * i);}}color /= (quality * direction + 1.0); // +1.0 for the initial colorreturn color;
}

而在著色器的入口,它會將所有部分組合起來渲染,其中關鍵在于下方代碼,這是實現邊緣液體感的處理部分:

#define S smoothstepvec2 uv2 = uv - uMouse.xy / R;
uv2 *= 0.5 + 0.5 * S(0.5, 1.0, icon.y);
uv2 += uMouse.xy / R;

它不是直接用 uv 去采樣紋理,而是創建了一個被扭曲的新坐標 uv2icon.y 是前面生成的位移貼圖,smoothstep 函數利用這個貼圖來計算一個縮放因子。

在圖標中心(icon.y 接近 1),縮放因子最大,使得 uv2 的坐標被推離中心,產生放大/凸起的效果,就像透過一滴水或一個透鏡看東西一樣,從而實現視覺上的折射效果。

最后利用 mix 把背景圖片混合進來,其中 LiquidGlass(uTexture, uv2, ...) 通過玻璃效果使用被扭曲的坐標 uv2 去采樣并模糊背景:

vec3 col = mix(texture(uTexture, uv).rgb * 0.8,0.2 + LiquidGlass(uTexture, uv2, 10.0, 10.0, 20.0).rgb * 0.7,icon.x
);

所以里實現的思路是扭曲的背景 + 模糊處理,我們把中間的 icon 部分屏蔽,換一張人臉圖片,可以看到更明顯的邊緣扭曲效果:

image-20250612151557905

當然,這個效果看起來并不明顯,我們還可以在這個基礎上做修改,比如屏蔽 uv2 *= 0.5 + 0.5 * S(0.5, 1.0, icon.y),調整為從中間進行放大扭曲:

//uv2 *= 0.5 + 0.5 * S(0.5, 1.0, icon.y);// 使用 mix 函數,以 icon.x (方塊形狀) 作為混合因子
// 在方塊外部 (icon.x=0),縮放為 1.0 (不扭曲)
// 在方塊內部 (icon.x=1),縮放為 0.8 (最大扭曲)
uv2 *= mix(1.0, 0.8, icon.x);

通過調整之后,實際效果可以看到變成從中間放大扭曲,從眼神扭曲上看起來更接近鎖屏里的效果:

當然,我們還可以讓扭曲按照類似水滴從中間進行扭曲,來實現非平均的液態放大:

 //vec2 uv2 = uv - uMouse.xy / R;//uv2 *= 0.5 + 0.5 * S(0.5, 1.0, icon.y);//uv2 += uMouse.xy / R;// ================== 新的水滴扭曲 ==================// 1. 計算當前像素到鼠標中心點的向量 (在 st 空間)
vec2 p = st - M;// 2. 計算該點到中心的距離
float dist = length(p);// 3. 定義水滴效果的作用半徑 (應與方塊大小一致)
float radius = PX(100.0);// 4. 計算“水滴凸起”的強度因子 (bulge_factor)
//    我們希望中心點 (dist=0) 強度為 1,邊緣點 (dist=radius) 強度為 0。
//    使用 1.0 - smoothstep(...) 可以創造一個從中心向外平滑衰減的效果,模擬水滴的弧度。
float bulge_factor = 1.0 - smoothstep(0.0, radius, dist);// 5. 確保該效果只在我們的方塊遮罩 (icon.x) 內生效
bulge_factor *= icon.x;// 6. 定義中心點的最大縮放量 (0.5 表示放大一倍,值越小放大越明顯)
float max_zoom = 0.5;// 7. 使用 mix 函數,根據水滴強度因子,在 "不縮放(1.0)" 和 "最大縮放(max_zoom)" 之間插值
//    中心點 bulge_factor ≈ 1, scale ≈ max_zoom (放大最強)
//    邊緣點 bulge_factor ≈ 0, scale ≈ 1.0 (不放大)
float scale = mix(1.0, max_zoom, bulge_factor);// 8. 應用這個非均勻的縮放效果
vec2 uv2 = uv - uMouse.xy / R; // 將坐標中心移到鼠標位置
uv2 *= scale;                  // 應用計算出的縮放比例
uv2 += uMouse.xy / R;          // 將坐標中心移回

使用這個非均勻的縮放效果,可以看到效果更接近我們想象中的液態 “放大”:

如下圖所示,最終看起來也會更想水面的放大,同時邊緣的“高亮”也顯得更加明顯:

當然,這里的實現都是非常粗糙的復刻,僅僅只是自娛自樂,不管是性能還是效果肯定和 iOS 26 的液態玻璃相差甚遠,就算不考慮能耗,想在其他平臺或者框架實現類似效果的成本并不低,所以單從技術實現上來說,能用液態玻璃風格作為系統 UI,蘋果應該是對于能耗控制和渲染成本控制相當自信才是

最后,如果感興趣的可以直接通過下方鏈接獲取 Demo :

  • https://github.com/CarGuo/gsy_flutter_demo/blob/master/lib/widget/liquid_glass_demo.dart

  • https://github.com/CarGuo/gsy_flutter_demo/blob/master/lib/widget/liquid_glass_demo2.dart

  • https://github.com/CarGuo/gsy_flutter_demo/tree/master/shaders

參考鏈接:

  • https://www.shadertoy.com/view/WftXD2

  • https://rive.app/marketplace/20904-39287-liquid-glass/

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

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

相關文章

Android工程中FTP加密傳輸與非加密傳輸的深度解析

詳細的FTP傳輸實現方案&#xff0c;包括完整代碼、安全實踐、性能優化和實際應用場景分析。 一、FTP傳輸類型對比表&#xff08;增強版&#xff09; 特性非加密FTPFTPS (FTP over SSL/TLS)SFTP (SSH File Transfer Protocol)協議基礎FTP (RFC 959)FTP SSL/TLS (RFC 4217)SSH…

C# 枚 舉(枚舉)

枚舉 枚舉是由程序員定義的類型&#xff0c;與類或結構一樣。 與結構一樣&#xff0c;枚舉是值類型&#xff1a;因此直接存儲它們的數據&#xff0c;而不是分開存儲成引用和數據。枚舉只有一種類型的成員&#xff1a;命名的整數值常量。 下面的代碼展示了一個示例&#xff0c…

一文詳解前綴和:從一維到二維的高效算法應用

文章目錄 一、一維前綴和?1. 基本概念?2. C 代碼實現?3. 應用場景? 二、二維前綴和1. 基本概念?2. C 代碼實現?3. 應用場景? 三、總結? 在算法競賽和日常的數據處理工作中&#xff0c;前綴和是一種極其重要的預處理技術。它能夠在常數時間內回答多次區間查詢&#xff0…

windows 開發

文章目錄 環境搭建數據庫關鍵修改說明&#xff1a;在代碼中使用該連接字符串&#xff1a;注意事項&#xff1a;實際使用 都說幾天創造一個奇跡&#xff0c;現在是真的這樣了&#xff0c;Just do it! 環境搭建 數據庫 需要下載這個SQL Server數據庫&#xff0c;然后每次Visua…

免費OCPP協議測試工具

免費OCPP 1.6J協議測試工具&#xff0c;簡單實用。除加密功能外&#xff08;后續版本支持&#xff09;&#xff0c;支持所有消息調試。 后續將添加2.01和和2.1協議支持. 歡迎使用 Charge-Test

高等數學基礎(行列式和矩陣的秩)

行列式主要用于判斷矩陣是否可逆及計算特征方程 初見行列式 行列式起源于線性方程組求解 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1 a_{12}x_2 b_1 \\ a_{21}x_1 a_{22}x_2 b_2 \end{cases} {a11?x1?a12?x2?b1?a21?x1?a22?x2…

開心燦爛go開發面試題

1.給你單鏈表的頭節點 head &#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表。 示例1: 輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[5,4,3,2,1] package main import “fmt” type ListNode struct { Val int Next *ListNode } func main() { l1 : &…

【Flutter】程序報錯導致的灰屏總結

【Flutter】程序報錯導致的灰屏總結 一、前言 在 Flutter 中&#xff0c;出現“灰屏”&#xff08;grey screen&#xff09;通常意味著 應用發生了未捕獲的錯誤&#xff0c;導致框架無法正確構建 UI。 這也是在面試過程中常常問到的。 二、錯誤分類 常見的會導致灰屏的錯誤…

基于物聯網設計的智慧家庭健康醫療系統

1. 項目開發背景 隨著物聯網&#xff08;IoT&#xff09;技術的發展&#xff0c;智能家居系統逐漸融入到我們的日常生活中&#xff0c;成為提高生活質量、增強家庭安全、提升健康管理的重要工具。特別是在健康醫療領域&#xff0c;借助物聯網技術&#xff0c;智能家居不僅能夠…

設計模式精講 Day 1:單例模式(Singleton Pattern)

【設計模式精講 Day 1】單例模式&#xff08;Singleton Pattern&#xff09; 文章內容 開篇 在軟件開發中&#xff0c;設計模式是解決常見問題的通用解決方案。作為“設計模式精講”系列的第一天&#xff0c;我們將深入講解單例模式&#xff08;Singleton Pattern&#xff09…

【衛星通信】3GPP標準提案:面向NB-IoT(GEO)場景的IMS信令優化方案-降低衛星通信場景下的語音呼叫建立時延

一、引言 隨著5G非地面網絡&#xff08;NTN&#xff09;技術的演進&#xff0c;基于NB-IoT的衛星通信&#xff08;如GEO地球同步軌道衛星&#xff09;逐漸成為偏遠地區語音服務的重要補充。然而&#xff0c;傳統IP多媒體子系統&#xff08;IMS&#xff09;的信令流程在帶寬受限…

軟件測試之簡單基礎的安全測試方法(另外包含軟測面試題庫)

文章目錄 前言安全測試是什么簡單基礎的安全測試方法密碼安全操作權限驗證SQL注入xss腳本攻擊文件上傳下載安全漏洞掃描Web掃描APP掃描 面試題庫&#xff08;僅參考&#xff09;參考目錄 前言 閱讀本文前請注意最后編輯時間&#xff0c;文章內容可能與目前最新的技術發展情況相…

LCEL:LangChain 表達式語言詳解與測試工程師的實踐指南

引言 在 AI 應用開發中&#xff0c;如何高效地組合多個步驟&#xff08;如提示模板、模型調用、輸出解析&#xff09;并優化執行流程&#xff0c;是開發者和測試工程師共同面臨的挑戰。LangChain Expression Language (LCEL) 作為 LangChain 的核心功能之一&#xff0c;提供了…

LeetCode面試經典150題—旋轉數組—LeetCode189

原題請見&#xff1a;Leetcode189-旋轉數組 1、題目描述 2、題目分析 首先容易想到的最簡單的方案&#xff0c;是算出來移動K步之后&#xff0c;新數組的每一個坐標與原坐標的映射關系&#xff0c;然后根據映射關系放到一個全新的數組&#xff0c;再把新數組的值賦給原數組。…

2.5 Rviz使用教程

新建終端&#xff0c;鍵入命令 roslaunch wpr_simulation wpb_simple.launch 再新建終端&#xff0c;鍵入命令 rviz修改Fix Frame 為 base_footprint 點擊add之后選擇RobotModel 再增加一個LaserScan 選擇激光雷達話題 可視化效果 配置的兩種方法 1.在Gazebo運行的基礎上&…

基于SpringBoot+JSP開發的招投標采購信息平臺

角色&#xff1a; 管理員、普通用戶 技術&#xff1a; 后端&#xff1a;Spring Boot Mybatis-Plus MySQL 前端&#xff1a;JSP 核心功能&#xff1a; 該平臺是一個用于管理投標和招標信息的系統&#xff0c;主要提供信息發布、用戶管理和交易管理等核心功能。 功能介紹…

【項目實訓#10】HarmonyOS API文檔RAG檢索系統后端實現

【項目實訓#10】HarmonyOS API文檔RAG檢索系統后端實現 文章目錄 【項目實訓#10】HarmonyOS API文檔RAG檢索系統后端實現一、背景簡介二、RAG技術原理與架構設計2.1 RAG技術原理回顧與提升2.2 系統架構設計 三、RAG引擎核心實現3.1 RAG引擎初始化3.2 查詢向量化3.3 文檔檢索實現…

專注于PLC數據采集MES交互解決方案

專注于PLC數據采集MES交互解決方案 前篇文章我們講到當下的制造行業在工業4.0的大趨勢下&#xff0c;MES系統成為現場制造過程管制的有利武器&#xff0c;更是質量追蹤的一把好工具。我們要知道產品在各個加工環節的結果。除了人工在各個制造環節錄入制造結果外&#xff0c;更…

微信小程序實現文字逐行動畫效果渲染顯示

1. 微信小程序實現文字逐行動畫效果渲染顯示 在微信小程序開發中,為了文字逐行動畫效果渲染可以通過JavaScript 和 WXML 的動態數據綁定來實現,實現文字逐行顯示的效果,同時結合 CSS 動畫提升視覺體驗。 ??如果需要更復雜的動畫效果(如縮放、移動等),可以使用微信小程序…

Redux 原理深度剖析

1. Redux 實現 定義 Action 和 Reducer 類型&#xff0c;為了簡便&#xff0c;先用JavaScript來演示。 1.1. 定義Action和Reducer類型 // 定義 Action 類型 /*** typedef {Object} Action* property {string} type*/// 定義 Reducer 類型 /*** callback Reducer* param {any…