iOS CAShapeLayer、CADisplayLink 實現波浪動畫效果

来源:http://www.cnblogs.com/silence-cnblogs/archive/2017/06/10/6979418.html
-Advertisement-
Play Games

iOS CAShapeLayer、CADisplayLink 實現波浪動畫效果 效果圖 代碼已上傳 GitHub:https://github.com/Silence GitHub/CoreAnimationDemo 可以自定義波浪高度、寬度、速度、方向、漸變速度、水的深度等參數。 實現原理 波浪的 ...


iOS CAShapeLayer、CADisplayLink 實現波浪動畫效果

效果圖

代碼已上傳 GitHub:https://github.com/Silence-GitHub/CoreAnimationDemo

可以自定義波浪高度、寬度、速度、方向、漸變速度、水的深度等參數。

實現原理

波浪的形狀繪製在 CAShapeLayer 上。通過 CADisplayLink 與屏幕刷新頻率同步,每次刷新都繪製新的波浪,並改變小船的位置和角度。另外,水和天空的顏色是漸變的,由 CAGradientLayer 實現,其中,顯示水的 CAGradientLayer 需要有波浪形狀的 CAShapeLayer 的遮罩(mask)。

CAShapeLayer

CAShapeLayer 的屬性 path (CGPath)就是圖層要顯示的形狀。把波浪的形狀繪製出來,賦值給此屬性即可。

創建 CADisplayLink,相應的 target 實現屏幕刷新時要調用的方法。把 CADisplayLink 加入 RunLoop 中。通過 isPaused 屬性控制 CADisplayLink 是否暫停(target 是否調用方法)

private var waveLink: CADisplayLink?
waveLink = CADisplayLink(target: self, selector: #selector(waveLinkRefresh))
waveLink?.isPaused = true
waveLink?.add(to: .current, forMode: .defaultRunLoopMode)

繪製波浪

波浪的形狀關鍵是正弦函數曲線

y = A * sin(x + B)

參數 A 決定了波浪的高度;參數 B 決定了波浪在 x 軸的位置。

用一個屬性 currentPhase 表示參數 B

private var currentPhase: CGFloat = 0

每次屏幕刷新的時候用 currentPhase 繪製,然後更新此屬性,加上一個固定的數。這樣波浪就會朝左或右勻速移動。

為了使波浪高度逐漸變化,用一個屬性表示參數 A,然後每次繪製後更新此屬性,加上一個固定的數,直到波浪高度達到目標值。

小船的位置和旋轉角度

已知小船 x 軸坐標,通過正弦函數可以直接計算出小船的 y 軸坐標。此外,小船需要隨著波浪旋轉,旋轉至船底與波浪錶面相切。這就要對正弦函數進行求導

y' = A * cos(x + B)

用以上式子計算出小船所在位置的 y',表示正弦函數在此處的切線斜率,幾何意義是切線與 x 軸的夾角的正切值。反正切即可求出切線與 x 軸的夾角,也就是小船需要旋轉的角度

angle = atan(y')

用以上旋轉角度,改變小船視圖(UIView)的 transform,調用 CGAffineTransform 的 rotated(by:) 方法,實現小船的旋轉。

CAGradientLayer

CAGradientLayer 預設的顏色漸變方向是由上至下。給 colors 屬性賦值一個包含 CGColor 的數組,則圖層顏色由上至下,從數組第一個值經中間值漸變至最後一個值。

顯示水的 CAGradientLayer 需要呈現波浪形狀,需要 CAShapeLayer 的遮罩。把繪製好波浪形狀的 CAShapeLayer 賦值給 CAGradientLayer 的 mask 屬性即可。

以上是動畫效果的實現原理,具體見 GitHub:https://github.com/Silence-GitHub/CoreAnimationDemo

轉載請註明出處:http://www.cnblogs.com/silence-cnblogs/p/6979418.html


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

-Advertisement-
Play Games
更多相關文章
  • 因為工作原因,經常關註有關互聯網行業的最新動態。這不,剛送走了高考,又迎來了每年的畢業季,看到好多人都說今年的前端工作不好找,很多童鞋簡歷投了一大堆,也沒有回應,發現連實習的機會都沒有,好不容易去面試了幾次,發現到處都是培訓機構。最後,眼裡都是數不盡的迷茫,甚至都開始懷疑人生了有沒有? 如果你是想要 ...
  • 簡單的省市區三級聯動,適合初學者入門學習的案例 目錄結構如下: 三級聯動.html 跟 JS文件夾是同個級別 效果圖如下: HTML代碼: JS代碼: ...
  • 環境搭建 環境搭建可以參考RN官網,也可以參考中文版本:http://reactnative.cn/docs/0.45/getting-started.html 如果你希望可以看到原版的安裝流程,可以看官方的地址,本文只是我個人的實踐,並且僅限於window平臺。 官方的地址:https://fac ...
  • 一 start命令 ionic start sdscapp --type=ionic1 ...
  • UX瀏覽服務是為了加速瀏覽網頁而開發的瀏覽服務,它解決了WebView的一系列問題,它能夠在網路差的情況下快速的瀏覽,比webview快一倍以上,是webview的優化代替方案。它擁有完善的緩存管理策略,經過優化的載入順序,廣告攔截引擎。 這次更新我們修複大量問題: 1. 緩存加速、DNS加速、弱網 ...
  • 一、在app/src/main/res下有 AndroidManifest.xml打開,打開後如下圖1 二、日誌工具log log.v() log.d() log.i() log.w() log.e() 在下圖中 中存在輸出 ...
  • 先看效果: 參照Android的實現方式用RadioButton來實現,但是Uwp的RadioButton並沒有安卓的Selector選擇器 下麵是一個比較簡單的實現,如果有同學有更好的實現,歡迎留言,讓我們共同進步。 1、首先自定義一個RadioImageButton控制項,並定義幾個依賴屬性,代碼 ...
  • 1.Android DVM(Dalvik VM)的進程和Linux的進程, 應用程式的進程是同一個概念嗎? DVM(Dalvik VM)指dalvik的虛擬機。每一個Android應用程式都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux 中的一個進程,所 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...