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