當我第一次通過Kotlin和Compose來實現一個Canvas時, 我收穫了什麼?

来源:https://www.cnblogs.com/clwater/archive/2023/04/27/17358680.html
-Advertisement-
Play Games

自從2019年Google推薦Kotlin為Android開發的首選語言以來已經經歷了將近四年的時間, Compose的1.0版本也發佈了將近2年的時間, Kotlin+Compose在現階段的Android開發過程中還遠遠達不到主流的程度. 我們是否應該開始嘗試這個組合? 這個組合有會給我們帶來什... ...


當我第一次通過Kotlin和Compose來實現一個Canvas時, 我收穫了什麼?

自從2019年Google推薦Kotlin為Android開發的首選語言以來已經經歷了將近四年的時間, Compose的1.0版本也發佈了將近2年的時間, Kotlin+Compose在現階段的Android開發過程中還遠遠達不到主流的程度. 我們是否應該開始嘗試這個組合? 這個組合有會給我們帶來什麼?

對於我來說, 我是個守舊又喜新的人, 自2018初我就嘗試用Kotlin來完成一些Android的工作了(Android For Bezier), 但是一直沒有將kotlin作為我個人的Android首要開發語言. 不過隨著Kotlin+Compose這個組合社區的完善, 越來越多的人開始嘗試這個組合, 併為這個組合的社區構建添了加自己的一份力. 得益於Kotlin和Java之間可以無感的互相調用, 越來越多的人(包括我)開始嘗試將Kotlin或Kotlin+Compose加入到現有的開發項目中, 本文將展示一些我在這個組合中遇到的收穫和思考.

從一個自定義Canvas開始

先看下效果, 動畫原始效果非原創, 在結合實際功能效果的情況下進行了二次設計.

Canavs

最終的實現結果還是比較滿意的, 額外的添加了許多的動畫效果. 或者說, 顯示的每個部分都是有自己的動畫的.

先說說收穫和思考

一般來說我都會從設計到代碼的實現過程依次講解, 但是這次我先講收穫和思考的原因, 主要是因為整個設計到代碼實現的過程在整體上和原來的開發(Java)沒有什麼本質的區別. 當然, 後面仍然會提供對這個動畫的詳細說明.

  1. Kotlin和Java
    Kotlin和Java之間的比較和關係我就不多贅述了, 不過通過在這個Canvas的Coding過程中, 對於Kotlin的使用和理解有著更深入的理解. 比較時兩種語言, 雖然兩者的關係十分的密切, 但是在真正使用的使用, 還是要避免將一種語言的習慣帶入到另一種.

  2. Compose
    最初的我項做一個通過Compose來實現的gist desktop工具, 不過當時的種種問題和資料的缺少讓我最終沒有完成這個項目. 當我真正在項目中使用Compose後, 我們才能理解Compose應用如何使用, 僅靠他人的介紹是完完全全達不到的體驗效果. 這個對大多數一直深耕於Android的開發者們來說是十分明顯的.

    其中首當其衝的就是響應式佈局的思路, 和我們最初使用的xml佈局所帶來的習慣其中的差異是十分巨大的.

    當我們通過xml來實現我們的佈局時(乃至我們直接通過 View.add() 構建的時候), 我們都是先創建一個View, 我們持有這個View的"把柄", 我們可以通過這個"把柄"來對這個View在任何時間任何地點做任意的修改.

    而當我們使用Compose進行佈局的時候, 我們需要現將Compose(Compose 就是Compose, 它和View是同級的)定義好, 告訴它應該在什麼情況下需要做什麼. 就像玉兔號一樣, 在地面的時候你可以為他添加各種的工具(履帶, 攝像頭...), 但是當你把它發射都月球上後, 哪怕是改一下錶面的花紋都無法做到了.

    最初的Coding過程中, 由於固有思路的原因, 想著先實現一部分的功能, 然後看下實現的效果在逐步添加相關的功能. 但是當我實現了某個效果再回來的時候, 在一小部分的情況下, 我不得不對現有的代碼進行很大的修改. 同時我也確認過, 如果不使用Compose的話, 是不需要改動如此大的. 這裡就是我在這個項目中對我觀念轉變最大的地方. "如果沒有設計完成, 就不要去實現它", 平時的這個問題被我們拿住"把柄"的View所掩飾了.

    換句話說, 使用Compose就像使用各種Builder一樣, 當我們沒有build()的時候, 我們可以做任何事情, 一旦我們完成build()了, 我們就不能這樣隨心所欲的控制它, 想想我們的AlertDialog.Builder().create().

  3. Kotlin Compose和Java XML
    在整個代碼中, 我都儘量使用Kotlin+Compose來進行實現各種功能, 就像Kotlin和Java直接可以很方便的互相使用, Compose和View直接也可以很簡單的互相融合, 在Coding過程中, 經驗的不足和對Kotlin Compose的不熟悉使得很多看似簡單的功能遲遲無法實現, 甚至一些效果對我來說, 不使用老方法我無法做到. (即便如此, 仍使用了一部分ValueAnimator而不是 rememberInfiniteTransition)

  4. 會讓我更多的使用Kotlin和Compose麽?
    經過一段時間的使用後(不僅僅是這個demo, 還有在實際工作中的使用), 我認為我會嘗試更多的Kotlin代碼和用Compose來構建頁面. 通常來說的Kotlin相對於Java來說代碼量會更少, 不過現在的各種輔助開發工具(Copilot, ChatGpt)使其"寫更少的代碼"看起來並不是十分能吸引人, 俗話說的好"紙上得來終覺淺,絕知此事要躬行", 當你真正的使用一段時間之後, 你會發現寫的少, 不僅僅是寫的少, 也代表了看的少, 理解的少, 改的少, 維護的少.當然, 這些都是建立在一定基礎上的, 在瞭解一定的特性和約定後才能達到, 不然最多的感受可能只有"這裡的功能是什麼? 這裡為什麼要這麼設計?", (是吧 協程).

    如果說Java的學習難度是線性的, 那麼Kotlin的學習難度我認為是拋物線的形狀, 入門比Java更簡單, 但是稍一深入, 由於有大量約定的特性, 使其中期難度比Java更難. 當然, 後期深入精通的部分都是需要不斷的學習和使用的.

    這導致了很多人初期使用的時候感覺很省心, 但是當嘗試使用或者深入學習的時候, 會發現很多的地方都無從下手, 或者預期的功能無法實現. 一是固有思維的作祟, 二是你認為學習完成的基礎知識還不足以讓你進行下一步. 這可能就是"基礎知識陷阱"吧. 最初的我, 認為Kotlin是Java的另一種實現形式, 認為直接的嘗試是沒有問題的. 但是就像是View和Compose直接的關係一樣, 雖然兩種之間都可以很輕易的互相使用, 但是, View就是View, Compose就是Compose, Kotlin就是Kotlin, Java就是Java. 兩者之間的關係並不是替代和補充. 而是實現同一目的的不同思路. "條條大路通羅馬"不是麽? 所以當你使用Kotlin和Compose的時候, 放棄一下固有的思維和觀念, Kotlin不是替代品, 它是另一條路.

對於我來說, 最大的問題是不可避免的使用了原有的思路來解決新的問題, 當然, 這也是在整個過程當中思考最多的, 多嘗試一下新的思路, 走出舒適圈. 才能有更大的提升.(記得設計完成了再實現, 如果你不想重新設計好幾次你的代碼的話.)

看看我們的Canvas

思考和收穫都寫完, 下麵我們來看看這個看起來還不錯的Canvas是如何實現的吧.

整體看來分為了四層, 分別是背景, 白天的雲彩, 夜晚的星星, 以及太陽和月亮.

背景

為了可以很明確的看到canvas的設計, 背景這裡沒有限制顯示範圍,可以看到這裡使用了四個不同半徑但是圓心在同一點的圓, 用來模擬不同層級光的效果.

白天的雲層

白天的雲層為了方便查看更改為了藍色來查看. 雲層的是由7個2層大小位置都不近相同的圓形繪製而成.

夜晚的星星

夜晚的星星也比較簡單, 在隨機的位置顯示菱形即可.

太陽

太陽是最簡單一個設計了, 只添加了一個顏色變化的效果.

月亮

月亮的設計也相對簡單, 添加了一個轉動的效果.

最後來看整體的設計還是比較簡單的. 但是陰影的部分耽誤了很多的時間(甚至部分效果未達到預期就沒有使用).

相關的代碼在[我的GitHub]中(https://github.com/clwater/AndroidComposeCanvas)


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

-Advertisement-
Play Games
更多相關文章
  • 本人習慣了Linux環境的du命令,在HP-UX下,發現du命令真的非常難用,有種讓人很難受的感覺。主要是因為HP-UX下的du命令參數比Linux平臺du命令參數要少很多,尤其是沒有-h這個參數,它只能以kb形式顯示文件/文件夾的大小,對於我來說,看起來非常不直觀。下麵是工作中,HP-UX平臺使用 ...
  • 環境: 工具:Firefox 84版本 或者 360游覽器-某特殊版本 系統版本:Windows 10 問題描述: 描述:進入某需要Flash插件的管理網站,使用edge等最新主流游覽器均無法調用Flash,開啟IE模式也沒有做用,網上的其他教程也因為時效性已經無法生效。 問題解釋: 解釋:各大主流 ...
  • 環境: 系統版本:Windows 10 家庭中文版 問題描述: 描述:按下Win+G後彈出提示框,需要使用新應用以打開此 ms-gamingoverlay 鏈接 問題解釋: 誤將Xbox game bar應用程式刪除了,無法找到啟動的程式。 這個程式我當時以為就是個打游戲的,我就刪除了,沒想到錄屏會 ...
  • 功能03-優惠券秒殺03 4.功能03-優惠券秒殺 4.6Redisson的分散式鎖 Redis分散式鎖—Redisson+RLock可重入鎖實現篇 4.6.1基於setnx實現的分散式鎖問題 我們在4.5自己實現的分散式鎖,主要使用的是redis的setnx命令,它仍存在如下問題: 4.6.2Re ...
  • 1)提升查詢效率 自動探測 SQL 複雜查詢條件預先合併成一個派生特征的 bitmap,預測和圈人時對複雜條件 SQL 重寫為派生特征。 2)提升導入速度 Spark 直接寫 Doris Tablet 文件,並掛載到 FE。 針對大導入場景與 Doris 團隊共建,提升寫入效... ...
  • 簡述 CloudCanal 去年支持 OceanBase 數據遷移同步能力後,隨著使用用戶增多以及問題反饋,近期對該能力進行了一輪較大規模的優化。 本篇文章簡要介紹這些優化點,以及未來該能力的演進方向。 優化點 大幅提升同步性能 CloudCanal 目前使用 OceanBase LogProxy ...
  • 4月20日,袋鼠雲成功舉行了以“數實融合,韌性生長”為主題的2023春季生長大會。會上,袋鼠雲自主研發的一站式大數據基礎軟體——數棧V6.0產品矩陣全新發佈。對旗下大數據基礎平臺、大數據開發與治理、數據智能分析與洞察三大模塊的全線產品進行全新升級,並重點發佈了企業級數據計算與存儲平臺——自研大數據引 ...
  • -- 創建表 drop table if exists emp; create table emp( empno int, ename varchar(50), job varchar(50), mgr int, hiredate date, sal decimal(7,2), comm decim ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...