主頁 > 移動端開發 > 當我第一次通過Kotlin和Compose來實作一個Canvas時, 我識訓了什么?

當我第一次通過Kotlin和Compose來實作一個Canvas時, 我識訓了什么?

2023-04-28 12:20:38 移動端開發

當我第一次通過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)

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/551404.html

標籤:Android

上一篇:xcode歷史版本下載

下一篇:返回列表

標籤雲
其他(158257) Python(38107) JavaScript(25396) Java(18003) C(15217) 區塊鏈(8260) C#(7972) AI(7469) 爪哇(7425) MySQL(7152) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5870) 数组(5741) R(5409) Linux(5332) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1961) Web開發(1951) HtmlCss(1928) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1855) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 當我第一次通過Kotlin和Compose來實作一個Canvas時, 我識訓了

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

    uj5u.com 2023-04-28 12:20:38 more
  • xcode歷史版本下載

    一、背景 較早之前做過一個專案,當時使用swift 3.x開發。 專案結束后就沒再有新需求與更新。 但最近呢需要對專案的某些功能進行調整,專案又重新被拾了起來。 我們知道現在的swift 版本已經到了 5.x, 相應的語法上較 3.x版本也有了不小的變化。使用最新版本的xcode都已經不支持swif ......

    uj5u.com 2023-04-27 11:04:14 more
  • xcode歷史版本下載

    一、背景 較早之前做過一個專案,當時使用swift 3.x開發。 專案結束后就沒再有新需求與更新。 但最近呢需要對專案的某些功能進行調整,專案又重新被拾了起來。 我們知道現在的swift 版本已經到了 5.x, 相應的語法上較 3.x版本也有了不小的變化。使用最新版本的xcode都已經不支持swif ......

    uj5u.com 2023-04-27 10:50:06 more
  • (轉)java.sql.SQLException: An attempt by a client to checkout

    jar包下載方式官網地址:MySQL :: Download Connector/J,如果你打不開官網,在下面我為你準備了直接下載jar包的鏈接地址。 在選擇作業系統時,此處選擇platform independent(獨立于平臺)。 8.0版本的jar包下載地址,點擊直接下載。 https://d ......

    uj5u.com 2023-04-27 09:18:15 more
  • 【FAQ】關于JavaScript版本的華為地圖服務Map的點擊事件與Marker

    一. 問題描述 創建地圖物件,并添加marker標記,對map和marker均添加了點擊事件; <body> <script> function initMap() { // 創建地圖物件 const map = new HWMapJsSDK.HWMap(document.getElementByI ......

    uj5u.com 2023-04-27 09:05:27 more
  • (轉)java.sql.SQLException: An attempt by a client to checkout

    jar包下載方式官網地址:MySQL :: Download Connector/J,如果你打不開官網,在下面我為你準備了直接下載jar包的鏈接地址。 在選擇作業系統時,此處選擇platform independent(獨立于平臺)。 8.0版本的jar包下載地址,點擊直接下載。 https://d ......

    uj5u.com 2023-04-27 08:59:57 more
  • 【FAQ】關于JavaScript版本的華為地圖服務Map的點擊事件與Marker

    一. 問題描述 創建地圖物件,并添加marker標記,對map和marker均添加了點擊事件; <body> <script> function initMap() { // 創建地圖物件 const map = new HWMapJsSDK.HWMap(document.getElementByI ......

    uj5u.com 2023-04-27 08:54:31 more
  • Claude:除ChatGPT外的另一種選擇

    前言 Claude 是 Anthropic 開發的人工智能產品。Anthropic 是由 11 名前 OpenAI 員工于 2022 年創立的人工智能公司,旨在構建安全、可解釋和有益于人類的人工智能系統。Claude 是該公司的第一個產品,得到了谷歌 3 億美元的投資。 與 ChatGPT 有什么區 ......

    uj5u.com 2023-04-26 08:39:35 more
  • 微信小程式自研業務介面的服務器一點配置記錄整理

    微信小程式的開發和APP的開發有些類似,但又略有不同。 App一般有很多版本,甚至要兼容很多版本兼容,尤其是各個小版本之間一般都是要共存的。當然如果有較大變化或者升級,尤其是底層邏輯或者資料庫結構改動,一般會強制升級。 因為要多個版本兼容,互相不影響使用,那么服務器的介面就需要多版本共存。 一般為了 ......

    uj5u.com 2023-04-26 08:39:21 more
  • 用戶訂閱付費如何拆解分析?看這篇就夠了

    會員制的訂閱付費在影音娛樂行業中已相當普及,近幾年,不少游戲廠商也開始嘗試訂閱收費模式。在分析具體的用戶訂閱偏好以及訂閱付費模式帶來的增長效果時,我們常常會有這些疑問: 如何從用戶的整體付費行為中具體拆解訂閱付費事件并分析? 想要了解當前應用內用戶的整體訂閱概況? 訂閱用戶和非訂閱用戶在留存與付費偏 ......

    uj5u.com 2023-04-26 08:31:10 more