运用前的准备工作

  1. android studio Arctic Fox版别或更新的版别

  2. 假如是一个新项目,能够在创建的时分,新建一个Empty Compose Activity

    Compose 初探

  3. 在module的build.gradle文件中添加

    android {
    b教程网站uildFeatures {
    compose true
    }
    composeOptions {
    kotlinCompilerExtensionVersion compose_version
    kotlinCompilerVersion '1.4.32'
    }
    }
    dependencies {
    implementatgoogle空间ion 'androidx.core:core-ktx:1.3.2androidstudio装置教程'
    implementation 'androidx.appcompat:appcompat:1.androidstudio虚拟机发动不了2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation "andro狗狗币idx.compose.ui:ui:$compose_versiandroidstudio按钮跳转页面on"
    implementation "andgithub下载roidx.compose.material:material:$compose_version"
    implementation "androidx.compose.ui:ui-tooling:$compose_vers教程诀窍2电影ion"
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
    implementation 'androidx.activity:activity-compose:1.3.0-alpha06'
    }
    

需求添加

buildFeatures {
compose true
}

教程高中

组件的界说

在CoGompose中一个UI组件google便是一个带有@Composable注解的函数

@ComposableGoogle
fun Greeting(name: String) {
Text(text = "Hello $name!")
}

布局组件

假如没有选用布局组件,直接单视图写到一个Compos教程的意思e中,会存在失常的状况。官方是这么说的:

A Composable function might emit several UI elements. However, if you dogoogle浏览器n’t provide guidance on how they should be arranged, Compose might arrgithub下载ange the elements in a way yandroidstudio官网ou dogooglen’t like

  • Row 横向摆教程英文放视图, Row的相关特征如下:

    inline fun Row(
    modifier: Modifier = Modifier,
    horizontalArrangoogle谷歌查找主页gement: Arrangement.Horizontal = Arrangement.Start,
    verticalAlignandroidstudio打包apkment: Alignment.Vertical = Alignment.Top,
    content: @Co宫颈癌前期症状mposa教程网ble RowScope.() -> Unit
    )
    
  • Column 纵向摆放视图, 其特征和上面GoRoandroidstudio官网w类似
  • Box 将一个元素掩盖在另一个上面, 类似于FrameLayout这种

视图组件

  • Text 类似于原生View中的TextView
  • Button 按钮
  • LazyColumn 类似于原生RecyclerView
  • Image 图片控件
    关于网络图片,能够选用Coil框架
  • TextField 文件输入框
  • Surface用来控Android+Studio制组件的布景,边框,文本颜色等
  • AlertDialog 弹窗控件教程诀窍2,类似于原生View中的AlertDialog

组件的状况处理

remember

经过remember来记载组件某些相关特征值,当特征发生变化,会自动触发UI的更新。

@Composable
f教程英文un HelloConte教程网nt() {
Column(modifi教程的意思er = Modifier.padding(16.dp)) {androidstudio装置教程
var nameS教程手绘tate = remember { mutableStateOf("") }
var name = nameState.value;
Text(
text = "Hello, $name!",
modifier = Modifgithub怎么下载文件ier.padding(bottom = 8公积金.dp),
style = Magithub官网terialTheme.typography.h5
)
TextField(
value = name,
onValueChange = { println("data----->$it");nameState.value = it }
)
}
}

这段代码完毕的androidstudio怎么导入他人的项目功用便是当用户在一个输入框中输入文字的时分,即时回显在页面上。当选用这种方法编码时,状况是耦合在组件中,当调用者不关心内部的状况的,这种方法是ok的,但它的坏处便是不利于组件教程动漫人物的复用。咱们能够将状况和组件分脱离,此时,便便是运用状况提高(state hoigoogleplay安卓版下载sting)的手法

@Com教程拼音posable
fun HelloScreen() {
var nameState = remember { mutableStateOf("") }
Helgithub官网loContent(name = nameState.value, onNameChange = { namegoogle地球State.value = it })
}
@Composable
fun HelloContent(name: String, onNameChange: (String)androidstudio装置教程 -> Unit) {
Colandroidstudio虚拟机发动不了umn(modifier = Modifier.padding(16.dp)) {
Text(
text = "Hello, $name!",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.h5
)
T教程网站extField(
value = nagithub永久回家地址me,
onValueChange = { onNagoogle谷歌查找主页me教程网Change(it) }
)
}
}

这里是将状况说到HelloContent的外面, 方面HelloConte教程拼音nt组件的复用

rememberSaveable

remember类似,差异在于remember教程动漫人物Saveable进行状况处理时,当activity或进程从头创建了(如屏幕旋转),其状况信息不会丢失。
将上面的var nameandroidstudio项目实例State = remember { mutableS教程网tateOf("") } 中的remember换成rememberS宫颈癌前期症状aveable就能够了

ViewModel

能够运用ViewModel进行大局的状况处理

class HelloViewModel : ViewModel() {
// LiveData holds state whi教程ch is observed by the UI
// (stGitHubate flows down from ViewModegithub敞开私库l)
private val _name = MutableLiveData("")
val namgithub敞开私库e: LiveData<String> = _name
// onNameChange is an event wGitHube're defining that the UI can invoke
// (events flow up frgoogle浏览器om UI)
fun onNamgithub永久回家地址eChange(newName: String) {
_name.value = newName
}
}
@Compos教程诀窍2电影able
fun HelloScreen(helloViewMGitHubodel: Hegoogle空间lloViewModel = viewModel()) {
// by defagithub直播平台永久回家ult, viewModel() follows the Lifecycle教程诀窍2 as thegoogle商铺 Activity or Fragment
/androidstudio衔接真机/ that calls HelloScreen(). This lifecycle can be modified by call狗狗币ers of HelloScreen.
// name is the currentgithub是干什么的 value of [helgithub中文社区loViewgoogle浏览器Modegithub打不开l.name]
// with an initial value of ""
val name: String by helloViewModel.name.observeAsStaandroidstudio装置教程te("")
HelloContent(name = name, onNameChange = { helloViewModegithub永久回家地址l.onNameChange(it) })
}

Modifers

Modifgoogle谷歌查找主页ers是用教程网站来装饰composable, Modifiers用来告知一个UI元素如何布局,闪现,和相关的行为。

布局相关的特征

  • fillMaxWidth
  • matchParentSize
  • height
  • width
  • padding
  • size

闪现

  • background
  • clip: 如Mod宫颈癌ifier.clip(RoundedCornerShape(4.dp)),一个圆角便出来了

绑定事件

运用clandroidstudio衔接真机ickable来绑定事件

Row(
Modifier
.fillMagithub下载xWidth()
.clickable { onClick(); },
vertic宫颈癌前期症状alAlignment = Alignment.CenterVertically
) {
...
}

实例

选用Compose计划的开发体会十分接googleplay近于用Vue或React, 代码结构十分清楚,不androidstudio项目实例必xml来画UI的确省了不少事,以下是一段代码片断来画一个微信的个人中心页

Compose 初探

@Preview(showBackg教程的意思round = true)
@Composable
fun PersonalCenter() {
Column() {
Header("Hello Woandroidstudio衔接真机rld", "Wechat_0001")
Divider(
Modifier
.fillMaxWidth()
.heGitHubighgithub中文官网网页t(8.dp), GrayBg
)
RowList()
Digoogleplay安卓版下载vider(
Modifier
.fillMaxHeight(), GrayBg
)
}
}
@Composable
fandroidstudio衔接真机ungithub是干什么的 Header(nickName: String, wechatNo: String) {
Row(
Modifier
.fillMaxWidth()google空间
.padding(24.dp, 24.dp, 16.dp, 24.dp),
verticalAlignment = Alignment.CenterVertically
) {
Image(
painter = painterResource(R.drawable.avatar),
contentDeandroidstudio打包apkscription = "头像",
Modandroidstudio装置教程ifier
.size(50.dp)androidstudio按钮跳转页面
.clip(
Rgithub敞开私库ougoogleplay安卓版下载ndedCornerShape(4.dp)
)
)
Column() {
Text(nickgithub是干什么的Name, Modifier.padding(12.dpgithub中文社区, 2.dp, 0.dp, 0.dp), Te教程诀窍2电影xtColor, fontSize = 18.sp)
Row(verticalAliggithub敞开私库nment = Alignment.CenterVertically) {
Text(
"微信号 :$wechatNo",
Modifier
.padding(12.dp, 10.dp, 0.dp, 0.dp)
.weight(宫颈癌前期症状1.0f), TextColorGray, fontSize = 14.sp
)
Icon(painterResource(R.drawable.ic_qrcode), "二维码", Modifier.size(16.dp))
Icon(
painterResource(R.drawable.right_arrow_3),
contentDescription宫崎骏 = "more",google谷歌查找主页
Modifier.padding(12.dp, 0.dp, 0.dp, 0.dp)
)
}
}
}枸杞
}
@Composagoogle服务框架blegoogle地球
fun RowItem(@DrawableRes icon: Int, title: String, onClick: () -> Unit) {
Row(
Modifier
.fillMaxWidth()
.clickable { oAndroid+StudionClick(); },
verticalAlignment = Alignmengithub永久回家地址t.CenterVertically
)androidstudio虚拟机发动不了 {
IGitHubmage(
painter = painterResource(icon), contentDescription = title + "icon",
Modifiergithub敞开私库
.padding(16.dp, 12.宫崎骏dp, 16.dp教程, 12.dp)google翻译
.size(24.dp)
)
Text(title, Modifier.weight(1f), TextColor, fontgoogle地球Size教程的意思 = 15.sp)
Icon(
paigoogle服务框架nterResource(R.drawable.right_arrow_3),
contentDescription = "more",
Modifier.padding(0.dp, 0.dp, 16.dp, 0.dp)
)
}
}
@Composable
fun R宫颈癌前期症状owList() {
var context = Localgoogleplay安卓版下载Context.current;
Column() {
RowItem(icon = R.drawable.ic_pay, title = "支付"狗狗币) { onItemCligoogle谷歌查找主页ck(context, "payment") }
Divider(
Modifier
.fillMaxWidth()
.height(androidstudio官网8.dp), GrayBg
)
RowItem(icon = R.drawable.ic_collections, title = "保藏") {
onItemClick(context, "保藏")
}
Divider(
Modifier
.fillMaxWidth()
.paddi工商银行ngandroidstudio导入项目无法运转(56.dp, 0.dp, 0.dp, 0.dp)
.height(0.2.dp), GrayBg
)
RowItem(icon = R.drawable.ic_photos, title = "相册") {
onItemClick(context, "相册")
}
Divider(
Modifier
.fillMaxWidth()
.padd教程网站ing(56.dp, 0.dp, 0.dp, 0.dp)
.height(0.2.dp), GrayBg
)
RowItem(icon = R.drawable.ic_cards, title = "卡包")教程英文 {
Toast.makeText(context, "payment", T教程网站oast.LENGTH_宫颈癌疫苗SHORT).show()
}
Divider(
Modgoogle商铺ifier
.fillMaxWidtGitHubh()
.paddiGong(56.dp, 0.dp, 0.dp, 0.dp)
.height(0.2.dp), GrayBg
)
RowItem(icon = R.drawable.ic_stickers, tit教程动漫人物le = "表情") {
Toast.makeText(context, "payment", Toast.LENGTH_SHORT).show()
}
Divider(
Modifier
.fillMaxWidth()
.height(8.dp), GrayBg
)
RowI工商银行tem(icon = R教程英文.drawable.ic_settings, title = "设置") {
Toast.makeText(context, "payment", Toast.LENGTH_SHORT).show()
}
}
}
fun onItemClick(context: Context, data: String) {
Toast.makeText(context, data, Toast.LENGTH_SHORT).show()
}

View中嵌Compose

var view = LinearLayout(this)
viewgithub打不开.addView(GoComposeView(this).apply {
setContent {
PersonalCenter();
}
})

Compose中嵌View

@Compose
fun RowList() {
...
AndroidView(github永久回家地址{View(congithub是干什么的text)}, Modifier.width(20.dp).height(20.dp).b宫崎骏ackground(Color.Green)){}
...
}

总结

  • Compose运用了一google空间套新的布局,渲染机制, 它里边的元素和咱们从前写的各种View是有差异的,比如Compose里边的Text并宫崎骏不是咱们从前知道的TextView或其它的原生控件, 它选用了更底层的api来完毕
  • 数据的自动订阅(完毕双向绑定)
  • androidstudio导入项目无法运转明式UI: compose经过自动订阅机制来完毕UI的自动更新
  • compose和现有的原生View混用

参看

  • Google 官方教程
  • developer.android.com/jetpack/com…
  • github.com/rengwuxigoogle谷歌查找主页an/…
  • developer.android.com/jetpack/com…
  • en.wikipedia.org/wiki/Side_e…