Android JetpackCompose使用教程講解
概況
compose 摒棄了原生開(kāi)發(fā)模式中的 xml,代碼結(jié)構(gòu)類似于 flutter
compose 僅支持 kotlin,雖然這玩意語(yǔ)法糖多但是也不難學(xué)
compose 可以通過(guò)極短的代碼行數(shù)構(gòu)建完善頁(yè)面
開(kāi)啟新工程
首先請(qǐng)去 android 官網(wǎng)下載 android studio;
官網(wǎng)下載速度是正常的,別擔(dān)心;
之后根據(jù)提示安裝 android sdk 以及 ndk,如果必須的話你還可以裝一個(gè)模擬器;
把手機(jī)直接連接到電腦上就可以進(jìn)行真機(jī)調(diào)試了(記得把手機(jī)的調(diào)試模式打開(kāi));
一切就緒,打開(kāi) android studio,點(diǎn)擊 file->new->new project->empty compose activity
稍等一會(huì),工程很快構(gòu)建完畢
文件結(jié)構(gòu)
創(chuàng)建新工程后,默認(rèn)會(huì)打開(kāi) MainActivity.kt
文件,這是我們的主頁(yè)面
根結(jié)構(gòu)
class MainActivity2 : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ComposeDemoTheme { // A surface container using the 'background' color from the theme Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background ) { Greeting("Android") } } } } }
setContent 在這里寫入頁(yè)面內(nèi)容,通過(guò)一個(gè)個(gè)組件逐步構(gòu)造
ComposeDemoTheme 表示根據(jù)默認(rèn)主題包中的內(nèi)容進(jìn)行設(shè)置(默認(rèn)主題包就在和 mainactivity 同級(jí)別的 themes 文件夾)
Surface 構(gòu)建頁(yè)面表面的一個(gè)組件
拆分方法
為了避免組件過(guò)度嵌套導(dǎo)致產(chǎn)生”死亡三角”,務(wù)必記得把必要的組件拆出來(lái)作為一個(gè)單獨(dú)的方法寫!
方法寫在本 activity 的 class 內(nèi)部,那么同文件夾內(nèi)的其他 kotlin 文件的方法都不會(huì)沖突;
若寫在 class 外(默認(rèn)),則不同文件夾將可能會(huì)發(fā)生名稱重復(fù)的沖突;
@Composable fun Greeting(name: String) { Text(text = "Hello $name!") }
加了 @Composable
注解的方法,表示這是一個(gè)組件,該注解必須添加!
該組件方法內(nèi)使用了 text
@Preview(showBackground = true) @Composable fun DefaultPreview() { ComposeDemoTheme { Greeting("Android") } }
compose 內(nèi)置了一個(gè)臨時(shí)預(yù)覽機(jī)制,即 preview;
加了@Preview 注解的代碼表示該代碼將作為臨時(shí)預(yù)覽而展示;
臨時(shí)預(yù)覽的方法不會(huì)對(duì)最終編譯生成的結(jié)果產(chǎn)生任何影響!?。?/p>
點(diǎn)擊代碼框右上角的 split,即可拆分為 代碼+預(yù)覽 布局
一切就緒后點(diǎn)擊 build,即可渲染預(yù)覽頁(yè)面
官方四節(jié)課教程細(xì)節(jié)剖析
官方教程地址:https://developer.android.google.cn/jetpack/compose/tutorial
data class
data class
類似于 typescript 的 interface,可以理解為定義了一個(gè)對(duì)象;
msg: Message
直接將 Message 作為一個(gè)類型來(lái)使用;
之后直接在 setContent 里面調(diào)用組件即可!
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MessageCard(Message("Android", "Jetpack Compose")) } } } data class Message(val author: String, val body: String) @Composable fun MessageCard(msg: Message) { Text(text = msg.author) Text(text = msg.body) }
組件代碼翻譯
@Composable fun MessageCard(msg: Message) { // 使用padding內(nèi)部撐開(kāi),all表示四周撐開(kāi) Row(modifier = Modifier.padding(all = 8.dp)) { Image( painter = painterResource(R.drawable.profile_picture), contentDescription = "Contact profile picture", modifier = Modifier // 設(shè)置該組件的大小為40dp .size(40.dp) // 把圖片變成圓形的 .clip(CircleShape) ) // 在image和column之間添加一個(gè)水平空格! Spacer(modifier = Modifier.width(8.dp)) Column { Text(text = msg.author) // 這里添加的是一個(gè)垂直空格! Spacer(modifier = Modifier.height(4.dp)) Text(text = msg.body) } } }
單例類
教程中我們用到了 SampleData
,然而由于外網(wǎng)無(wú)法訪問(wèn),數(shù)據(jù)集自然下載不了,但是我們可以簡(jiǎn)單的模擬一個(gè)數(shù)據(jù)集:
object 創(chuàng)建單例類;
listOf 模擬列表!
object SampleData { val conversationData = listOf( Message( "jack", "test name" ), Message( "fakeman", "idaofihoeqh iodhoe hfqow " + "ehfsdla hfioeh fowh fldsah lfhoqei hfo" + " hod hsafohewqgjlfjdsnvc,mxbg kjwfhw" + " hoe hfsdhf kwejashd has jhdqwo oiadhf oiha " + "oi dosi awqi jiojagakfjk ladfi jslkf h" + "lwkeh flkadsh flah fioewhfoadshlfhsa" ), ) }
適配器的替代品
// by表示使用委托,設(shè)置一個(gè)針對(duì)于本compose的全局狀態(tài) // 可以理解為isExpanded是一個(gè)全局變量! var isExpanded by remember { mutableStateOf(false) } // clickable設(shè)置column中項(xiàng)目是否可以點(diǎn)擊,以及點(diǎn)擊后執(zhí)行的代碼 // 代碼和vue類似,點(diǎn)一下就反轉(zhuǎn)一下,達(dá)到開(kāi)啟和收回的效果 Column(modifier = Modifier.clickable { isExpanded = !isExpanded }) { ... Surface( shape = MaterialTheme.shapes.medium, elevation = 1.dp, ) { Text( text = msg.body, modifier = Modifier.padding(all = 4.dp), // 判斷全局狀態(tài)isExpanded值 // 如果isExpanded為true,那么顯示所有行(即展開(kāi)) // 如果isExpanded為false,那么僅顯示一行(即收縮) maxLines = if (isExpanded) Int.MAX_VALUE else 1, style = MaterialTheme.typography.body2 ) } }
簡(jiǎn)單小動(dòng)畫
// 同樣的委托,注冊(cè)全局動(dòng)畫狀態(tài) // 由于內(nèi)容過(guò)于龐雜,后續(xù)將會(huì)詳細(xì)介紹動(dòng)畫狀態(tài)是個(gè)什么東西! val surfaceColor by animateColorAsState( if (isExpanded) MaterialTheme.colors.primary else MaterialTheme.colors.surface, )
到此這篇關(guān)于Android JetpackCompose使用教程講解的文章就介紹到這了,更多相關(guān)Android JetpackCompose內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android基礎(chǔ)之startActivityForResult()的用法詳解
這篇文章主要給大家介紹了Android中startActivityForResult()的用法,文中給出了詳細(xì)的介紹與示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定參考借鑒價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2017-01-01Android開(kāi)發(fā)實(shí)現(xiàn)仿京東商品搜索選項(xiàng)卡彈窗功能
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)仿京東商品搜索選項(xiàng)卡彈窗功能,涉及Android布局及事件響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android 解決游戲發(fā)行切包資源索引沖突的問(wèn)題
這篇文章主要介紹了Android 解決游戲發(fā)行切包資源索引沖突的問(wèn)題,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03Android編程獲取網(wǎng)絡(luò)時(shí)間實(shí)例分析
這篇文章主要介紹了Android編程獲取網(wǎng)絡(luò)時(shí)間,結(jié)合實(shí)例形式對(duì)比分析了Android通過(guò)訪問(wèn)網(wǎng)絡(luò)及通過(guò)GPS獲取網(wǎng)絡(luò)時(shí)間的具體步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-01-01Android實(shí)現(xiàn)定時(shí)任務(wù)及鬧鐘
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)定時(shí)任務(wù)及鬧鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06Android自定義View實(shí)現(xiàn)打字機(jī)效果
最近在做Android開(kāi)發(fā)的時(shí)候,需要做類似于打字機(jī)打字的效果,字一個(gè)一個(gè)地蹦出來(lái),顯示每一個(gè)字都帶有打字的聲音。現(xiàn)在分享給大家,有需要的可以參考借鑒。2016-08-08Android使用listview實(shí)現(xiàn)分頁(yè)刷新(線程休眠模擬)
這篇文章主要為大家詳細(xì)介紹了Android使用listview實(shí)現(xiàn)分頁(yè)刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android scrollview實(shí)現(xiàn)底部繼續(xù)拖動(dòng)查看圖文詳情
這篇文章主要為大家詳細(xì)介紹了Android scrollview實(shí)現(xiàn)底部繼續(xù)拖動(dòng)查看圖文詳情,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02