主頁 > 移動端開發 > Jetpack Compose 基礎 | 混個臉熟篇

Jetpack Compose 基礎 | 混個臉熟篇

2021-01-14 13:08:06 移動端開發

在這里插入圖片描述

環境搭建

開發工具

由于 Jetpack Compose 目前還沒有出正式版,所以要想開發體驗,需要下載 最新 Canary 版的 Android Studio 預覽版,

創建新專案

打開最新 Canary 版的 Android studio 預覽版,創建一個新專案,你會發現創建新專案模板有一個 Empty Compose Activity 的模板,選擇它創建一個專案就可以體驗 Jetpack Compose 了,
image.png

在創建 Jetpack Compose 你會發現 _minimumSdkVersion _最小只能選擇 API level 21 ,也就是 Jetpack Compose 支持的最小版本,

專案創建好了,先不著急開發,先看看配置,是如何讓專案支持 Jetpack Compose 開發的,以便以后我們把 Jetpack Compose 添加到以前的專案中去,

  1. Jetpack Compose 是基于kotlin語言開發的框架,那么你的專案至少要確保支持 kotlin,如果你的專案還不支持,請查看官網教程 將 Kotlin 添加到現有應用 自行配置,( 😲 啥,都2021年了 專案還不支持 kotlin 😝 ),
  2. 打開專案的 app/build.gradle 檔案,關于 Jetpack Compose 的相關配置如下
android {
    defaultConfig {
        ...
        // Jetpack Compose 最小支持版本 21 
        minSdkVersion 21
    }

    buildFeatures {
        // 此 module 啟動 Jetpack Compose
        compose true
    }
    ...

    //kotlin 相關引數配置
    kotlinOptions {
        jvmTarget = "1.8"
        // 0?? 啟用新的 jvm IR 
        useIR = true
    }

    // Jetpack compose 相關引數配置
    composeOptions {
        //kotlin 額外編譯版本 和Jetpack Compose 版本一致
        kotlinCompilerExtensionVersion compose_version
        //kotlin編譯版本,要1.4及以上
        kotlinCompilerVersion kotlin_version
    }
}


dependencies {
   	...
    // Jetpack compose 相關依賴
    // 基礎組件
    implementation "androidx.compose.ui:ui:$compose_version"
    // Material Design 組件相關實作
    implementation "androidx.compose.material:material:$compose_version"
    // ui相關工具,比如視圖預覽
    implementation "androidx.compose.ui:ui-tooling:$compose_version"
}


關于 0?? 配置處參考 kotlin 1.4 新特性 | 新的 JVM IR backend ,
本文 Jetpack compose 版本compose_version = ‘1.0.0-alpha09’ , kotlin 版本 kotlin_version=‘1.4.21’
?? 由于 Jetpack compose 沒有推出正式版,api 可能會有變化,本文后期盡量跟進最新api,如果沒有來得及更新,發現下文中部分 api 不可以用了請多多包涵,或留言告知本人多謝 🙏 ,

看看 Jetpack Compose 長啥樣

打開 MainActivity.kt 檔案,如果編譯順利的話,你應該看到類似下面的樣子
在這里插入圖片描述

重繪視圖,當代碼發生變化是,點擊它可以重繪視圖
進行互動模式,比如視圖上有個按鈕,就可以不用運行直接點擊并作出對應的回應,
可以把當前視圖直接部署到設備上看效果,這個還是挺方便的,
更多關于布局預覽工具的使用,可以查看官網上關于此內容的介紹 https://developer.android.google.cn/jetpack/compose/preview

仔細看上圖,你會發現 Text() 是過時的,此處建議替換成 androidx.compose.material.Text ,在沒有穩定版本,經常 api用著用著過時、改名、或者直接被刪掉都是很正常的 😁 ,

在 Jetpack Compose 作為構建原生界面的工具包,我們還是用 Activity/Fragment 來加載視圖,在以前 XML 布局模式下,Activity 關聯視圖使用 setContentView() 函式,在 Jetpack Compose 中加載關聯視圖使用 setContent 函式,如下所示

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            //添加一個 Jetpack Compose 視圖
             Greeting("Android")
        }
   }

可組合 (Composable) 函式

在以前 View 視圖模式下,我們撰寫視圖都是在 XML 檔案中去書寫,在 Jetpack Compose 中我們都用被加上 @Composable 注解的 kotlin 函式來構建界面,如下代碼所示

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!")
}
  1. 可組合函式的函式名一般首字母大寫,以便和普通函式區分,
  2. 可組合函式只能在其他可組合函式中呼叫,這一點有點類似協程 suspend 函式,
  3. 雖然函式用 @Composable 注解,但 Jetpack Compose 并不是一個注入處理器,Compose 在 Kotlin 編譯器的型別檢測與代碼生成階段依賴 Kotlin 編譯器插件作業,此說法來自 深入詳解 Jetpack Compose | 實作原理 這篇文章中,感興趣可以去看一看,

學習第一個組件Text

上面創建的 Jetpack Compose 專案實體中就用到 Text 這個組件,在 Jetpack Compose 所有的組件都是 可以組合函式,所以Text 也不例外,原始碼如下

@Composable
fun Text(
    text: String,//顯示的內容
    modifier: Modifier = Modifier, // 關于布局的設定
    color: Color = Color.Unspecified,// 文字顏色
    fontSize: TextUnit = TextUnit.Unspecified,//文字大小
    fontStyle: FontStyle? = null, //文字風格
    fontWeight: FontWeight? = null,//文字粗細
    fontFamily: FontFamily? = null, //字體風格
    letterSpacing: TextUnit = TextUnit.Unspecified,//字間距
    textDecoration: TextDecoration? = null,//文字裝飾、比如下劃線
    textAlign: TextAlign? = null,//對齊方式
    lineHeight: TextUnit = TextUnit.Unspecified,//行高
    overflow: TextOverflow = TextOverflow.Clip,// 文字顯示不完的處理方式
    softWrap: Boolean = true,// 文本是否應在換行符處中斷,對中文沒啥用
    maxLines: Int = Int.MAX_VALUE,//最大行數
    onTextLayout: (TextLayoutResult) -> Unit = {},
    style: TextStyle = AmbientTextStyle.current
) {
	……
}

我們需要設定個性化 Text 組件,只要傳入對應的引數就行了,和 XML 添加對應屬性差不多,

比如把文字改成藍色

@Composable
fun TestText(){
    Text(text = "Hello Android",color= Color.Blue)
}

想看效果 就在setContent呼叫此函式,或者在預覽函式中呼叫

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            //將視圖添加到Acitivity
            TestText()
        }
    }   
}


  @Preview(showBackground = true)
  @Composable
  fun DefaultPreview() {
     TestText()
  } 

預覽效果
image.png

再學一個 Button 組件

@Composable
fun Button(
    onClick: () -> Unit,// 按鈕的點擊事件
    modifier: Modifier = Modifier,
    enabled: Boolean = true, //是否啟用
    interactionState: InteractionState = remember { InteractionState() },
    elevation: ButtonElevation? = ButtonDefaults.elevation(),//海拔
    shape: Shape = MaterialTheme.shapes.small,//形狀
    border: BorderStroke? = null,//邊框
    colors: ButtonColors = ButtonDefaults.buttonColors(),//顏色
    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,//內邊距
    content: @Composable RowScope.() -> Unit //內容
) { …… }

這個 Button 組件點擊事件 onClick 和內容 content 是必填引數外,好像沒有設定 Button 文字的引數,這和我們以前在 XML 構建視圖不太一樣,那么我們怎么讓 Button 顯示文字呢? 我們在content 添加一個Text組件就可以了,

@Composable
fun TestButton() {
    Button(onClick = { }) {
        Text(text = "button")
    }
}

最后一個引數 content 是函式型別,為了讓這個函式體里面能呼叫可組合函式 所以在這個引數還加個 @Composable 表示是一個可以組合函式型別,所以 Button 的 content 的函式體中可以呼叫其它可組合函式,

image.png
如果我們讓Button顯示圖片,那么我們就把 Text 換成 Image 就行了,Jetpack Compose 給我提供了簡單Button、Text、Image 組件(組合函式) 通過我們不同的組合方式就創造了一些新的組件,

動態改變Text的文本內容

@Composable
fun TestButton() {
    //宣告一個可變狀態值
    val  text =mutableStateOf("button")
    Button(onClick = { text.value = "我被點擊了" /*改變值*/}) {
        Text(text = text.value/*使用值*/)
    }
}

我們宣告一個宣告一個可變狀態值text,讓 Text 的內容設定為 text.value 當我們點擊按鈕的時候,text.value 的值被改變 Jetpack Compose 就會幫我們重新渲染用到 text.value 的地方,

Jetpack Compose 的靈活性

Jetpack Compose 都是用 kotlin 函式,那么就可以用 kotlin 語法來構建界面了

@Composable
fun TestForView() {
    val names = listOf("knight", "Tom", "Jack","kk")
    Column {
        names.forEach { Text(text = it) }
    }
}

Column 是一種布局方式,讓子級垂直順序排列,這些子級我們現在直接用回圈語法就可以了

預覽效果
image.png
當然,如果條目多的話這樣寫就不合適了,我們可以把 Column 替換成 LazyColumn , LazyColumn 只會加載當前顯示的條目和 RecyclerView 類似,它的用法也很簡單,如下

    val names = listOf("knight", "Tom", "Jack", "kk")
    LazyColumn {
        items(names) { Text(text = it) }
    }

總結

本文敘述了如何搭建 Jetpack Compose 環境及工程,簡單了解了一下 Jetpack Compose 是什么樣子,學習了兩個組件 Text 和 Button ,也看到了 Jetpack Compose 在 kotlin 的加持下 如此的靈活,Jetpack Compose 作為 Android 新的界面工具包,功能還是挺豐富的,本文只能說和 Jetpack Compose 的初探,混個臉熟,關于什么是宣告式?、布局如何構建、界面狀態和資料如何處理等等,等以后我們在慢慢探討,

相關資料

本文配套的 Codelabs

Android 官方 Codelabs | Jetpack Compose basics

Android 官方網站 | Jetpack Compose 相關檔案

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

標籤:其他

上一篇:Android萬字干貨!從簡歷準備到大廠真題,“金三銀四”跳槽大廠必備寶典!

下一篇:安卓開發學習——day4

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(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
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more