Android Compose 一:基礎控件

Flutter 與 Compose 組件辣么像,難道是同一個google團隊整的;也未深究,只是猜測。

創建項目

需要使用新版本Android studio,忽略步驟…

項目目錄

在這里插入圖片描述

MainActivity說明
1 系統默認頁面

在這里插入圖片描述
@Preview 修飾的方法,只用來供開發者預覽使用,刪除不影響運行
@Composable 修飾的方法 只能被@Composable修飾的方法調用

預覽效果
在這里插入圖片描述

2 MyApplicationTheme 說明

MyApplicationTheme 對應的時 ui.theme 中的Theme.kt中的 MyApplicationTheme ; ctrl+左鍵點過去
在這里插入圖片描述
下面看代碼

@Composable
fun MyApplicationTheme(darkTheme: Boolean = isSystemInDarkTheme(),// Dynamic color is available on Android 12+dynamicColor: Boolean = true,content: @Composable () -> Unit
) {

咋看這這么像flutter 萬物皆組件嘞;咱也不懂,咱也不敢吭;

  • 同樣MyApplicationTheme 是被@Composable注解修飾
darkTheme: Boolean = isSystemInDarkTheme(), //判斷是否是暗黑主題

那么我們把它寫死成ture;
預覽結果 變黑啦
在這里插入圖片描述

dynamicColor: Boolean = false, //動態顏色

暫未發現有啥變化
在這里插入圖片描述
代碼里判斷了支持動態顏色,調用了

/*** Creates a light dynamic color scheme.** Use this function to create a color scheme based off the system wallpaper. If the developer* changes the wallpaper this color scheme will change accordingly. This dynamic scheme is a* light theme variant.** @param context The context required to get system resource data.*/
@RequiresApi(Build.VERSION_CODES.S)
fun dynamicLightColorScheme(context: Context): ColorScheme {val tonalPalette = dynamicTonalPalette(context)return lightColorScheme(primary = tonalPalette.primary40,onPrimary = tonalPalette.primary100,primaryContainer = tonalPalette.primary90,onPrimaryContainer = tonalPalette.primary10,inversePrimary = tonalPalette.primary80,secondary = tonalPalette.secondary40,onSecondary = tonalPalette.secondary100,secondaryContainer = tonalPalette.secondary90,onSecondaryContainer = tonalPalette.secondary10,tertiary = tonalPalette.tertiary40,onTertiary = tonalPalette.tertiary100,tertiaryContainer = tonalPalette.tertiary90,onTertiaryContainer = tonalPalette.tertiary10,background = tonalPalette.neutral99,onBackground = tonalPalette.neutral10,surface = tonalPalette.neutral99,onSurface = tonalPalette.neutral10,surfaceVariant = tonalPalette.neutralVariant90,onSurfaceVariant = tonalPalette.neutralVariant30,inverseSurface = tonalPalette.neutral20,inverseOnSurface = tonalPalette.neutral95,outline = tonalPalette.neutralVariant50,)
}

百度翻譯
在這里插入圖片描述

content: @Composable () -> Unit 頁面布局內容@Composable修飾的組件

content 應該就是Surface,kotlin 最后一個參數如果是lambda表達式,那么lambda表達式可以放在外邊

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {MyApplicationTheme(content = {Surface(modifier = Modifier.fillMaxSize(),color = MaterialTheme.colorScheme.background) {Greeting("Android")}})
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {MyApplicationTheme(){Surface(modifier = Modifier.fillMaxSize(),color = MaterialTheme.colorScheme.background) {Greeting("Android")}}
}
MyApplicationTheme 方法的實現代碼分析
 val colorScheme = when {dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {     //這就是動態顏色val context = LocalContext.currentif (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)}darkTheme -> DarkColorSchemeelse -> LightColorScheme}val view = LocalView.current    if (!view.isInEditMode) {     //這個就是判斷 是否在編輯模式  然后設置了狀態欄的顏色SideEffect {val window = (view.context as Activity).windowwindow.statusBarColor = colorScheme.primary.toArgb()WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme  //這一樣也是設置狀態欄的顏色  大概意思就是看翻譯}}MaterialTheme(colorScheme = colorScheme,    //設置主題顏色   ui.theme.Colortypography = Typography,   // ui.theme.Typecontent = content)

view.isInEditMode 注釋的翻譯
在這里插入圖片描述
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
在這里插入圖片描述

通過以上的分析,我們或許可以實現 多主題的功能 用來更改app的主題顏色 字體顯示大小(比如老年模式)等功能 //TODO 后續嘗試

基礎組件

組件一般都包含Modifier的參數

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {Text(text = "Hello $name!",modifier = Modifier.padding())
}

方法參數有個 modifier: Modifier = Modifier ctrl+左鍵 點
發現是Modifier.kt 的對象

 // The companion object implements `Modifier` so that it may be used as the start of a// modifier extension factory expression.companion object : Modifier {override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R = initialoverride fun <R> foldOut(initial: R, operation: (Element, R) -> R): R = initialoverride fun any(predicate: (Element) -> Boolean): Boolean = falseoverride fun all(predicate: (Element) -> Boolean): Boolean = trueoverride infix fun then(other: Modifier): Modifier = otheroverride fun toString() = "Modifier"}

使用Modifier都是使用 此伴生對象;是所有鏈式調用的起點
打個斷點看看
在這里插入圖片描述
例如我們寫了如下代碼

Text(text = "Hello $name!",modifier = Modifier.padding(20.dp))

調用的是Padding.kt的 其實使用的是 PaddingModifier

@Stable
fun Modifier.padding(all: Dp) =this.then(PaddingModifier(start = all,top = all,end = all,bottom = all,rtlAware = true,inspectorInfo = debugInspectorInfo {name = "padding"value = all}))

PaddingModifier 其實實現LayoutModifier

private class PaddingModifier(val start: Dp = 0.dp,val top: Dp = 0.dp,val end: Dp = 0.dp,val bottom: Dp = 0.dp,val rtlAware: Boolean,inspectorInfo: InspectorInfo.() -> Unit
) : LayoutModifier, InspectorValueInfo(inspectorInfo) {

LayoutModifier

@JvmDefaultWithCompatibility
interface LayoutModifier : Modifier.Element {

Modifier.Element

  @JvmDefaultWithCompatibilityinterface Element : Modifier {override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R =operation(initial, this)override fun <R> foldOut(initial: R, operation: (Element, R) -> R): R =operation(this, initial)override fun any(predicate: (Element) -> Boolean): Boolean = predicate(this)override fun all(predicate: (Element) -> Boolean): Boolean = predicate(this)}

Modifier 是個接口 實現如下
在這里插入圖片描述

Modifier 可用來設置形狀,大小,位置,邊距,透明度,點擊 等
例如 Text的modifier可以設置如下
在這里插入圖片描述

modifier = Modifier.padding()
Padding.kt Modifer的擴展方法
在這里插入圖片描述

Text 文本
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {Text(text = "Hello $name!",modifier = modifier)
}
Image 圖片
 Image(painter = painterResource(id = R.drawable.img_lufei),  //資源contentDescription = "",   //描述modifier = Modifier.size(80.dp).clip(CircleShape),  //大小 形狀contentScale = ContentScale.Crop  //渲染方式)
Spacer 空白
 Text(text = "Hello $name!")Spacer(modifier = Modifier.padding(20.dp))Text(text = "Hello llo lo $name!")
Column 橫布局
 Column(modifier = Modifier.padding(10.dp)) {Text(text = "Hello $name!")Spacer(modifier = Modifier.padding(20.dp))Text(text = "Hello llo lo $name!")}
Row 豎布局
Row(modifier = Modifier.wrapContentHeight(align = Alignment.CenterVertically)) {Image(painter = painterResource(id = R.drawable.img_lufei),contentDescription = "",modifier = Modifier.size(80.dp).clip(CircleShape),contentScale = ContentScale.Crop)Column(modifier = Modifier.padding(10.dp)) {Text(text = "Hello $name!")Spacer(modifier = Modifier.padding(20.dp))Text(text = "Hello llo lo $name!")}}
效果

在這里插入圖片描述

其他布局用到時詳解
接下來的問題
  • 布局的對齊方式 在父布局中的位置 父布局控制子布局的位置

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10797.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10797.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10797.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VUE.JS詳細的使用方法

Vue.js是一個輕量級的前端JavaScript框架&#xff0c;它用于構建用戶界面和單頁應用。以下是Vue.js的基本使用方法和幫助。 安裝Vue.js 使用npm: npm install vue使用CDN: <script src"https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.min.js"></script&…

撤銷 git add 操作(忽略被追蹤的文件)

文章目錄 引言I git rm命令來取消暫存【推薦】II 撤銷特定文件的暫存狀態2.1 git rese2.2 git restoresee also引言 應用場景: 修改.gitignoregitignore只能忽略那些原來沒有被追蹤的文件,如果某些文件已經被納入了版本管理中,則修改.gitignore是無效的。那么解決方法就是先…

Kruskal算法刷題筆記

理論基礎&#xff1a; 例題&#xff1a; 卡碼網---53&#xff1a;尋寶 題目 題目描述 在世界的某個區域&#xff0c;有一些分散的神秘島嶼&#xff0c;每個島嶼上都有一種珍稀的資源或者寶藏。國王打算在這些島嶼上建公路&#xff0c;方便運輸。 不同島嶼之間&#xff0c…

精選多個炫酷的數據可視化大屏(含源碼),拿走就用~

末尾有鏈接 演示地址&#xff1a;可視化大數據展示中心 (null.fit) 可視化大數據展示模板-科技語者 (chgskj.cn)

block性能考慮和線程安全

性能考慮 頻繁地創建和銷毀大量的 block 可能會對性能造成影響&#xff0c;特別是當這些 block 被拷貝到堆上時。同時&#xff0c;block 捕獲大量數據時也會增加內存使用。 在討論性能考慮時&#xff0c;主要關注的是 block 的創建、拷貝到堆上以及捕獲變量的成本。以下是針對…

【Java】:方法重寫、動態綁定和多態

目錄 一個生動形象的例子 場景設定 1. 方法重寫&#xff08;Method Overriding&#xff09; 2. 動態綁定&#xff08;Dynamic Binding&#xff09; 3. 多態&#xff08;Polymorphism&#xff09; 歸納關系&#xff1a; 重寫 概念 條件 重寫的示例 重載與重寫的區別 …

CUDA is not availabe on this machine.

assert torch.cuda.is_available(), "CUDA is not availabe on this machine." AssertionError: CUDA is not availabe on this machine. 這個錯誤信息表明你嘗試在PyTorch中使用CUDA&#xff08;也就是NVIDIA的GPU加速&#xff09;&#xff0c;但是你的機器上似乎沒…

libssh C++封裝之七(File)

1 概述 libssh是一個在客戶端和服務器端實現SSHv2協議的多平臺C庫。使用libssh,您可以遠程執行程序、傳輸文件、使用安全透明的隧道、管理公鑰等等。本文描述的對libssh客戶端功能的C++封裝。 libssh下載地址 3 實現 3.6 File File類型可以讀寫遠程文件。 3.6.1 File定義 …

使用rsync+lnotify實現遠程數據實時同步備份

目錄 1、定時備份與實時備份區別 2、配置客戶端 2.1、在客戶端安裝inotify-tools軟件。以便提供inotifywait inotifywatch 輔助工具程序 2.2 驗證&#xff1a;監控客戶端/data_backup目錄的變化 2.3 編寫自動同步腳本 2.4 后臺運行腳本 2.5 驗證數據實時同步效果 1、定…

【JS面試題】call - apply - bind

推薦嗶站一個老師的視頻講解&#xff0c;非常詳細易懂&#xff0c;5分鐘學會&#xff01;前端面試題&#xff1a;call、apply、bind的基本概念 這三個都是函數的方法&#xff0c;用來改變函數中的this指向&#xff01; 關于call的使用&#xff1a;&#xff08;3個方法類似&am…

SpringCloud:服務拆分和遠程調用

程序員老茶 &#x1f648;作者簡介&#xff1a;練習時長兩年半的Java up主 &#x1f649;個人主頁&#xff1a;程序員老茶 &#x1f64a; P? ?S : 點贊是免費的&#xff0c;卻可以讓寫博客的作者開心好久好久&#x1f60e; &#x1f4da;系列專欄&#xff1a;Java全棧&#…

使用socat做端口轉發

最近買的云上mongo數據庫但是數據庫不支持外網訪問&#xff0c;準備做iptables轉發但是一直不成功&#xff0c;騰訊云官方給予的解釋是受服務器內啟動的docker影響 做iptables轉發會沖突&#xff0c;所以只能另想辦法&#xff0c;我發現使用socat做轉發也很好用&#xff0c;所以…

JAVA_4

JAVA_4 一、JAVA內存總體架構二、棧的特點如下三、堆的特點如下四、方法區&#xff08;又叫靜態區&#xff0c;也是堆&#xff09;特點如下五、this的本質 一、JAVA內存總體架構 多個線程里面有&#xff1a;程序計數器、虛擬機棧、本地方法棧方法區&#xff1a;運行時常量池堆…

FPGA相關論文閱讀

一、Achieving 100Gbps Intrusion Prevention on a Single Server 論文名稱中文翻譯&#xff1a;在單臺服務器上實現100Gbps吞吐量的入侵防御檢測。 文章中的Mixed-1和Norm-1 二、Distributed Password Hash Computation on Commodity Heterogeneous Programmable Platforms…

【回溯 字典樹(前綴樹)】212. 單詞搜索 II

本文涉及知識點 回溯 字典樹&#xff08;前綴樹&#xff09; LeetCode212. 單詞搜索 II 給定一個 m x n 二維字符網格 board 和一個單詞&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二維網格上的單詞 。 單詞必須按照字母順序&#xff0c;通過 相鄰的單元…

第3周 后端微服務基礎架構與前端項目聯調配備

第3周 后端微服務基礎架構與前端項目聯調配備 1. 微服務項目層次設計與Maven聚合1.1 項目層次設計1.2 父項目pom1.2.1 打包方式 1.3 創建通用 ************************************************************************************** 1. 微服務項目層次設計與Maven聚合 1.1…

電商平臺遭遇DDOS、CC攻擊有什么防護方案

電商平臺遭遇DDOS、CC攻擊有什么防護方案&#xff1f;在數字化浪潮的推動下&#xff0c;電商平臺已成為現代商業的重要組成部分&#xff0c;為消費者提供便捷、多樣的購物體驗。然而&#xff0c;隨著業務的發展&#xff0c;電商平臺也面臨著日益嚴峻的網絡安全挑戰&#xff0c;…

Tower for Mac:Git管理的新境界

Tower for Mac&#xff0c;讓您的Git管理進入新境界&#xff01;這款專為Mac用戶打造的Git客戶端&#xff0c;憑借其出色的性能和豐富的功能&#xff0c;成為眾多開發者的首選工具。 Tower不僅支持常規的Git操作&#xff0c;如提交、推送和拉取&#xff0c;還提供了許多高級功能…

四、VGA項目:聯合精簡幀+雙fifo+sobel算法 實現VGA顯示

前言&#xff1a;該項目實際上是在很多基礎的小練習上合成起來的&#xff0c;例如涉及到uart&#xff08;rs232&#xff09;的數據傳輸、雙fifo流水線操作、VGA圖像顯示&#xff0c;本次內容在此基礎上又增添了sobel算法&#xff0c;能實現圖像的邊沿監測并VGA顯示。 文章目錄…

簡單的DbUtils工具類【精細】

目錄 單條通用增刪改方法 1.創建maven項目&#xff0c;并加載依賴 2.創建數據庫連接工具類(Dbutils類) 3.創建一個執行器(SqlExecutor類) 4.通用(增&#xff0c;刪&#xff0c;改)方法 1.創建方法 2.創建userInfo實體類 3.創建測試類&#xff0c;測試增&#xff0c;刪&#xf…