栗子:@Composable () -> Unit
setContent { PrimaryTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { Column { Row { Button( onClick = { themeTypeState.value = ThemeType.RED_THEME }, modifier = Modifier.width(100.dp), colors = ButtonDefaults.buttonColors(containerColor = Color.Yellow) ) { Greeting(name = "按钮1") } Button( onClick = { themeTypeState.value = ThemeType.GREEN_THEME }, modifier = Modifier.width(100.dp), colors = ButtonDefaults.elevatedButtonColors() ) { Greeting(name = "按钮2") } } Greeting(name = "Hello Android") Greeting(name = "Hello 345") } } } }
Text
fun Text( text: String, //显示内容 modifier: Modifier = Modifier, //修饰,可修改透明度,边框,背景等 color: Color = Color.Unspecified, //文字颜色 fontSize: TextUnit = TextUnit.Unspecified,// size 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 = LocalTextStyle.current //文本的样式配置,如颜色、字体、行高等。 )
modifier:在此处用来修饰 Text,Modifer 提供了很多扩展,如透明度,背景,边框等
示例:
@Composable fun Greeting(name: String) { Text( text = name, fontSize = 18.sp, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.primary, modifier = Modifier.height(30.dp) ) }
Button
fun Button( onClick: () -> Unit,//点击时调用 modifier: Modifier = Modifier,//同上 enabled: Boolean = true,//是否启用 elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),// z轴上的高度 shape: Shape = FilledButtonTokens.ContainerShape.toShape(), border: BorderStroke? = null, colors: ButtonColors = ButtonDefaults.buttonColors(), contentPadding: PaddingValues = ButtonDefaults.ContentPadding, content: @Composable RowScope.() -> Unit )
shape
调整 button 的样式,例如 RoundedCornerShape 是圆角矩形的样式,CircleShape 是圆形的样式,CutCornerShape 是切角样式
border
外边框,默认是 null,Border 有两种使用方式,1 Border(size: Dp, color: Color),2 Border(size: Dp, brush: Brush) 。
第二种需要自己创建一个笔刷,去绘制外边框,例如要实现渐变的外边框。
colors
按钮的颜色,默认是 ButtonDefaults.buttonColors() 。可选的有:
其中可以设置按钮的背景色,未启用的颜色等。
栗子:
Button( onClick = { themeTypeState.value = ThemeType.GREEN_THEME }, modifier = Modifier.width(100.dp), colors = ButtonDefaults.buttonColors( containerColor = Color.Yellow, contentColor = Color.Red, disabledContainerColor = Color.Black, disabledContentColor = Color.Green ) ) { Greeting(name = "按钮2") }
OutLinedButton
具有外边框的按钮,内部使用的也是 Button。默认会有一个边框,其参数和 Button 一致,
TextButton
默认的 button 在有主题的时候,默认背景是主题颜色,而 textButton 背景默认是透明的。TextButton 默认使用的颜色是 ButtonDefaults.textButtonColors()
Image @Composable fun Image( painter: Painter, bitmap: ImageBitmap, // contentDescription: String?, modifier: Modifier = Modifier, alignment: Alignment = Alignment.Center, contentScale: ContentScale = ContentScale.Fit, alpha: Float = DefaultAlpha, colorFilter: ColorFilter? = null )
painter:图片资源,使用 PainterResource 来完成。
contentDescription:无障碍提示文本信息
contentScale :类似于 ImageView 中的 scaleType 属性。
colorFilter:将某种颜色应用到图片上
alpha:不透明度
示例
@Composable @Preview fun Image() { Image( painter = painterResource(id = R.drawable.one), contentDescription = "无障碍提示", contentScale = ContentScale.Crop, modifier = Modifier .width(100.dp) .height(100.dp) ) }
像一些圆图或者边框啥的就可以在 modifer 中直接设置了,如下:
@Composable @Preview fun Image() { Image( painter = painterResource(id = R.drawable.one), contentDescription = "无障碍提示", contentScale = ContentScale.Crop, modifier = Modifier .width(100.dp) .height(100.dp) .clip(shape = CircleShape) .border(2.dp, color = Color.Red, shape = CircleShape) ) }
加载网路图片
加载网路图片需要借助第三方库 coil,使用方式如下:
//图片加载库 implementation("io.coil-kt:coil:2.0.0") implementation("io.coil-kt:coil-compose:2.0.0")
@Composable @Preview fun Image() { AsyncImage( model = "https://img0.baidu.com/it/u=3147375221,1813079756&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=836", contentDescription = "无障碍提示", contentScale = ContentScale.Crop, modifier = Modifier .width(100.dp) .height(100.dp) .clip(shape = CircleShape) .border(2.dp, color = Color.Red, shape = CircleShape) ) }
Spacer
和原生的一样,需要空白区域时可以使用 Spacer ,使用方式如下:
Spacer(modifier = Modifier.height(100.dp))
Surface
对内容进行装饰,例如设置背景,shape 等
fun Surface( modifier: Modifier = Modifier, shape: Shape = Shapes.None, color: Color = MaterialTheme.colorScheme.surface, contentColor: Color = contentColorFor(color), tonalElevation: Dp = 0.dp, shadowElevation: Dp = 0.dp, border: BorderStroke? = null, content: @Composable () -> Unit )
color :设置 Surface 的背景色,默认是主题中的 surface 颜色。
contentColor:此 Surface 为其子级提供的首选内容颜色。默认为 [color] 的匹配内容颜色,或者如果 [color] 不是来自主题的颜色,这将保持在此 Surface 上方设置的相同值。
tonalElevation:当 [color] 为 [ColorScheme.surface] 时,高程越高,浅色主题颜色越深,深色主题颜色越浅。
shadowElevation:阴影大小
Scaffold
脚手架的意思,和 Flutter 中的 Scaffold 是一样的,通过 Scaffold 我看可以快速的对页面进行布局,例如设置导航栏,侧滑栏,底部导航等等。
fun Scaffold( modifier: Modifier = Modifier, topBar: @Composable () -> Unit = {}, bottomBar: @Composable () -> Unit = {}, snackbarHost: @Composable () -> Unit = {}, floatingActionButton: @Composable () -> Unit = {}, floatingActionButtonPosition: FabPosition = FabPosition.End, containerColor: Color = MaterialTheme.colorScheme.background, contentColor: Color = contentColorFor(containerColor), content: @Composable (PaddingValues) -> Unit )
topBar:Toolbar,常用的有 CenterAlignedTopAppBar,SmallTopAppBar,MediumTopAppBar 等。
bootomBar:底部导航栏
snackbarHost:
floatingActionButton:按钮
floatingActionButtonPosition:按钮位置
containerColor:背景颜色
contentColor:内容首选颜色
看一个栗子:
Scaffold( topBar = { //..... }, bottomBar = bottomBar, ) { Box( modifier = Modifier .fillMaxSize() .padding(top = it.calculateTopPadding(), bottom = it.calculateBottomPadding()) ) { content.invoke(it) } }
需要注意的是,如果使用了 toolbar 或者 bootomBar,就会把 content 中的内容挡住,这个时候就需要使用 PaddingValue 设置内边距了。
还有一点须要注意,如果要使用沉浸式状态栏,就需要自定义 topBar 了,要不然状态栏会被 topBar 覆盖。下面代码是设置沉浸式状态栏的。
///系统 UI 控制器 implementation "com.google.accompanist:accompanist-systemuicontroller:0.24.8-beta" //正确获取状态栏高度 api "com.google.accompanist:accompanist-insets-ui:0.24.8-beta"
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) setContent { SetImmersion() PrimaryTheme { SetContent() } } } @Composable private fun SetImmersion() { if (isImmersion()) { val systemUiController = rememberSystemUiController() SideEffect { systemUiController.run { setSystemBarsColor(color = Color.Transparent, darkIcons = isDark()) setNavigationBarColor(color = Color.Black) } } } }
底部导航栏
@Composable fun MainCompose(navController: NavHostController, mainBottomState: MutableState<Int>) { SetScaffold( bottomBar = { BottomBar(mainBottomState) } ) { when (mainBottomState.value) { 0 -> HomeCompos(navController) 1 -> ProjectCompos() 2 -> FLCompos() else -> UserCompos() } } } @Composable private fun BottomBar(mainBottomState: MutableState<Int>) { BottomNavigation( backgroundColor = MaterialTheme.colors.background, ) { navigationItems.forEachIndexed { index, navigationItem -> BottomNavigationItem( selected = mainBottomState.value == index, onClick = { mainBottomState.value = index }, icon = { Icon( imageVector = navigationItem.icon, contentDescription = navigationItem.name ) }, label = { BottomText( isSelect = mainBottomState.value == index, name = navigationItem.name ) }, selectedContentColor = Color.White, unselectedContentColor = Color.Black ) } } } @Composable fun BottomText(isSelect: Boolean, name: String) { if (isSelect) { Text( text = name, color = MaterialTheme.colors.primary, fontSize = 12.sp ) } else { Text( text = name, color = Color.Black, fontSize = 12.sp ) } }
如果看的不是特别清楚,可以直接点这里看
最后
到这里,这篇文章也完了。这篇文章主要讲了一下 Compose 中最基本的一些 核心思想以及 UI 函数以及主题啥的。这也是我最开始接触到 Compose 学到的东西,所以这也算是我的学习笔记吧。