Android + Desktop 俄羅斯方塊

訪問【W(wǎng)RITE-BUG數(shù)字空間】_[內(nèi)附完整源碼和文檔]
就我自己的體驗(yàn)來說,使用 Compose 開發(fā)的應(yīng)用我感受不到和 Android 原生開發(fā)之間有什么性能差異,但 Compose 在開發(fā)難度上會(huì)低很多
Google 官網(wǎng)上是這么介紹 Compose 的:Jetpack Compose 是用于構(gòu)建原生界面的新款 Android 工具包,它可簡化并加快 Android 上的界面開發(fā),使用更少的代碼、強(qiáng)大的工具和直觀的 Kotlin API,快速讓應(yīng)用生動(dòng)而精彩
長期以來,Android 的視圖層次結(jié)構(gòu)可以表示為一個(gè)視圖樹,視圖樹中包含著若干個(gè) View 和 ViewGroup。當(dāng)應(yīng)用的數(shù)據(jù)由于用戶交互等原因而發(fā)生變化時(shí),界面的層次結(jié)構(gòu)就需要進(jìn)行更新以顯示最新數(shù)據(jù)。最常見的界面更新方式就是使用findViewById()等函數(shù)遍歷視圖樹,并通過調(diào)用 button.setText(String)、container.addChild(View) 或 img.setImageBitmap(Bitmap) 等方法來改變特定節(jié)點(diǎn),而這些方法就會(huì)改變 View 的內(nèi)部狀態(tài)。但這種手動(dòng)操縱視圖的方式提高了出錯(cuò)的可能性。如果一條數(shù)據(jù)需要在多個(gè)位置呈現(xiàn),開發(fā)者可能一不小心就會(huì)忘記更新某個(gè)顯示它的視圖。此外,當(dāng)兩項(xiàng)更新以意外的方式發(fā)生沖突時(shí),也很容易造成異常狀態(tài)。例如,某項(xiàng)更新可能會(huì)嘗試修改剛剛從界面中移除的節(jié)點(diǎn)。一般來說,軟件維護(hù)復(fù)雜性會(huì)隨著需要更新的視圖數(shù)量增多而增長
在過去的幾年中,整個(gè)行業(yè)已開始轉(zhuǎn)向聲明性界面模型,該模型大大簡化了與構(gòu)建和更新界面關(guān)聯(lián)的工程設(shè)計(jì)。該技術(shù)的工作原理是在概念上從頭開始重新生成整個(gè)屏幕,然后僅執(zhí)行必要的更改。此方法可避免手動(dòng)更新有狀態(tài)視圖層次結(jié)構(gòu)的復(fù)雜性。Compose 就是一個(gè)適用于 Android 的新式聲明性界面工具包,提供了聲明性 API,讓開發(fā)者可在不以命令方式改變前端視圖的情況下呈現(xiàn)應(yīng)用界面,從而使編寫和維護(hù)應(yīng)用界面變得更加容易
可組合函數(shù)
Compose 的重點(diǎn)就在于 @Composable函數(shù),即可組合函數(shù),每個(gè)可組合函數(shù)可以接收若干入?yún)?shù)用于參與視圖結(jié)構(gòu)的繪制說明,但函數(shù)不返回任何值??山M合函數(shù)只用于描述視圖結(jié)構(gòu)如何繪制以及如何與用戶進(jìn)行交互,但不需要返回視圖對象,而是由 Compose 根據(jù)開發(fā)者的描述來生成具體的視圖對象
本游戲的 icon 就是通過這種方式來生成的??梢钥吹?PreviewTetrisIcon() 函數(shù)并不包含返回值,當(dāng)然這種情況下也不需要入?yún)?shù)。此外,Compose 的一個(gè)優(yōu)點(diǎn)就是所見即所得,通過添加 @Preview 注解就可以預(yù)覽實(shí)現(xiàn)效果,每次修改過后無需編譯,只要刷新一下就可以看到修改結(jié)果



