目錄
Jetpack Compose是用於構建原生Android UI的現代工具包。 Jetpack Compose使用更少的代碼,強大的工具和直觀的Kotlin API,簡化並加速了Android上的UI開發。這是Android Developers 官網對它的描述。
本文不是教你Jetpack Compose 的一些基本使用方法,而是爲啥我們需要Jetpack Compose 的一些簡潔,讓我們對Jetpack Compose 有更深層次的瞭解。如果你想看Jetpack Compose 的快速上手和基本使用,請看我前面的文章Android Jetpack Compose 最全上手指南
1. 爲什麼我們需要一個新的UI 工具?
在Android中,UI工具包的歷史可追溯到至少10年前。自那時以來,情況發生了很大變化,例如我們使用的設備,用戶的期望,以及開發人員對他們所使用的開發工具和語言的期望。
以上只是我們需要新UI工具的一個原因,另外一個重要的原因是View.java
這個類實在是太大了,有太多的代碼,它大到你甚至無法在Githubs上查看該文件,因爲它實際上包含了30000
行代碼,這很瘋狂,而我們所使用的幾乎每一個Android UI 組件都需要繼承於View。
GogleAndroid團隊的Anna-Chiara表示,他們對已經實現的一些API感到遺憾,因爲他們也無法在不破壞功能的情況下收回、修復或擴展這些API,因此現在是一個嶄新起點的好時機。
這就是爲什麼Jetpack Compose 讓我們看到了曙光。
2. Jetpack Compose的着重點
包括一下幾個方面:
-
- 加速開發
-
- 強大的UI工具
-
- 直觀的Kotlin API
2.1 加速開發
如果你是一個初級開發工程師,你總是希望有更多的時間來寫業務邏輯,而不是花時間在一些如:動畫、顏色變化等事情上,看看下面這個View:
這個Material Edit-text 似乎看起來很簡單,但是其實背後有許多東西需要關注,比如:動畫、顏色改變、狀態管理等等。
而Jetpack Compose 爲我們提供了很多開箱即用的Material 組件,如果的APP是使用的material設計的話,那麼使用Jetpack Compose 能讓你節省不少精力。
2.2 強大的UI工具
沒有正確工具的UI工具包是無用的,因此從過去10年的經驗中能學到不少,Jetpack Compose 團隊開始和JetBrains 合作,以提供開發者強大的工具包,在Android Studio 上大規模的支持Compose 能力。
看一看在Android Studio上的表現:‘
上圖是使用Jetpack Compose 開發UI時,在Android Studio 上的預覽,你可以看到,在左邊編碼時,右邊你能同時展現UI即時預覽,比如在明/暗模式下的狀態切換,都能在右邊及時展示出來。
它與我們現在使用的Android Studio 中的text/Design
相似,但是它更加先進,使用很簡單,這個功能只能在Android Studio4.0以上預覽版,開發compose 時使用。
2.3 直觀的Kotlin API
對於開發者而言,Jetpack Compose 的用途不僅僅是Android UI,因此用Kotlin來編寫他們並開源。當然,所有Android代碼都是開源的,但特別強調的是Compose代碼,它每天在這裏更新(https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/ui
)。因此,您可以查看和使用代碼,同時也可以在此處提供反饋。
由於Compose仍在開發之中,因此每個開發人員的反饋都很重要。
3. API 設計
十多年來,Android團隊在創建API和審查API方面擁有豐富的經驗,但有一個收穫-他們使用Java作爲編程語言。但有一個問題-他們使用的是Java作爲開發語言。
Jetpack Compose是第一個使用Kotlin正在開發中的大型項目,因此Android團隊正在探索Kotlin API指南的新世界,以創建一組特定於Compose API的指南,該工作仍在進行中,仍然有很長的路要走。
4. Compose API 的原則
4.1 一切都是函數
正如我前面的文章所說,Compose是一個聲明式UI系統,其中,我們用一組函數來聲明UI,並且一個Compose函數可以嵌套另一個Compose函數,並以樹的結構來構造所需要的UI。
在Compose中,我們稱該樹爲UI 圖,當UI需要改變的時候會刷新此UI圖,比如Compose函數中有if
語句,那麼Kotlin編譯器就需要注意了。
4.2 頂層函數(Top-level function)
在Compose的世界中,沒有類的概念,全都是函數,並且都是頂層函數,因此不會有任何繼承和層次機構問題。
@Composable
fun checkbox ( ... )
@Composable
fun TextView ( ... )
@Composable
fun Edittext ( ... )
@Composable
fun Image ( ... )
在此過程中,Compose函數始終根據接收到的輸入生成相同的UI,因此,放棄類結構不會有任何害處。從類結構構建UI過渡到頂層函數構建UI對開發者和Android 團隊都是一個巨大的轉變,頂層函數還在討論之中,還沒有發佈release 版。
4.3 組合優於繼承
Jetpack Compose首選組合而不是繼承。 Compose會基於其他部分構建UI,但不會繼承行爲。
如果你經常關注Android或者對Android有所瞭解,你就會知道,Android中的幾乎所有組件都繼承於View類(直接或間接繼承)。比如EidtText
繼承於TextView
,而同時TextView
又繼承於其他一些View,這樣的繼承機構最終會指向跟View即View.java
。並且View.java
又非常多的功能。
而Compose團隊則將整個系統從繼承轉移到了頂層函數。Textview
,EditText
,複選框
和所有UI組件都是它們自己的Compose函數,而它們構成了要創建UI的其他函數,代替了從另一個類繼承。
4.4. 信任單一來源
信任單一來源是構建整個Jetpack Compose 一項非常重要的特性
。如果您習慣了現有的UI工具包,那麼您可能會知道執行點擊的工作原理。如下代碼所示:
@Override
public boolean performClick(){
setChecked(!mChecked);
final boolean handled = super.performClick();
...
}
首先,它改變view的狀態,然後執行動作,這會導致許多bug,例如複選框,因爲它首先從已選中狀態
變爲未選中
,反之亦然,然後由於某種原因,如果操作失敗,開發人員必須手動分配先前的狀態。
而在Compose中呢,功能正好相反。在此,複選框等功能具有兩個參數。一個是在UI中顯示狀態,另一個是lambda函數,用於觀察UI應相應更改的狀態變化。
@Composable
fun Checkbox(checked : Boolean,
onCheckedChange : ((Boolean) -> Unit)),
....)
5. 深入瞭解Compose
如上圖所示,Compose在運行時分爲四個部分。讓我們一一看一下。
5.1 Core
顧名思義,這是Compose的核心,如果您不想深入學習,可以跳過它。
基本上,核心包含四個構建模塊:
- 繪製(Draw)
- 佈局(Layout)
- 輸入(Input)
- 語義(Semantics)
1、Draw — Draw 給了你訪問Canvas的能力,因此你可以繪製你要的任何自定義View
2、Layout — 通過佈局,我們可以測量事物並相應地放置視圖。
3、Input — 開發人員可以通過輸入訪問事件並執行手勢
4、Semantics — 我們可以提供有關樹的語義信息。
5.2. Foundation
Foundation的核心是收集上面提到的所有內容,並共同創建一個抽象層
,以使開發人員更輕鬆調用。
5.3 Material
在這一層,所有的Material組件將會被提供,並且我們可以通過提供的這些組件來構建複雜的UI。
這是Compose團隊所做的出色工作中最精彩的部分,在這裏,所有提供的View都有Material支持,因此,使用Compose來構建APP, 默認就Material風格的,這使得開發者少了很多工作。
6. 插槽API
插槽API的出現是爲了給開發人員留出了很多空間,以便他們可以執行所需的任何自定義操作,Android團隊試圖猜測開發人員可能會想到的許多自定義設置,但他們無法一直想象開發人員的想法,例如使用帶drawable
的TextView。
因此,Compose團隊爲組件留出了空間,以便開發人員可以執行所需的任何操作,例如使用按鈕
。你可以保留文本
或帶有圖標的文本
或所需的任何內容
,如下所示
以上就是本文的全部內容,感謝你的閱讀,如果覺得不錯,請點贊👍、轉發✈️、收藏📁 三連支持一波。
每天都有乾貨文章持續更新,可以微信搜索
「 技術最TOP 」
第一時間閱讀,回覆【思維導圖】【面試】【簡歷】有我準備一些Android進階路線、面試指導和簡歷模板送給你