news 2026/4/16 14:44:30

Android Jetpack Compose - Alignment、Arrangement、Carousel、Checkbox、TriStateCheckbox

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android Jetpack Compose - Alignment、Arrangement、Carousel、Checkbox、TriStateCheckbox

一、Alignment

  • Alignment 用于控制子元素对齐方式
@StablefuninterfaceAlignment{...companionobject{// 2D Alignments.@StablevalTopStart:Alignment=BiasAlignment(-1f,-1f)@StablevalTopCenter:Alignment=BiasAlignment(0f,-1f)@StablevalTopEnd:Alignment=BiasAlignment(1f,-1f)@StablevalCenterStart:Alignment=BiasAlignment(-1f,0f)@StablevalCenter:Alignment=BiasAlignment(0f,0f)@StablevalCenterEnd:Alignment=BiasAlignment(1f,0f)@StablevalBottomStart:Alignment=BiasAlignment(-1f,1f)@StablevalBottomCenter:Alignment=BiasAlignment(0f,1f)@StablevalBottomEnd:Alignment=BiasAlignment(1f,1f)// 1D Alignment.Verticals.@StablevalTop:Vertical=BiasAlignment.Vertical(-1f)@StablevalCenterVertically:Vertical=BiasAlignment.Vertical(0f)@StablevalBottom:Vertical=BiasAlignment.Vertical(1f)// 1D Alignment.Horizontals.@StablevalStart:Horizontal=BiasAlignment.Horizontal(-1f)@StablevalCenterHorizontally:Horizontal=BiasAlignment.Horizontal(0f)@StablevalEnd:Horizontal=BiasAlignment.Horizontal(1f)}}
  1. TopStart、TopCenter、TopEnd、CenterStart、Center、CenterEnd、BottomStart、BottomCenter、BottomEnd:Box 的 contentAlignment 使用,或者,其子元素的 align 使用
Box(modifier=Modifier.fillMaxSize(),contentAlignment=Alignment.Center,){Text("test content")}
Box(modifier=Modifier.fillMaxSize()){Text(text="content1",modifier=Modifier.align(Alignment.TopStart))Text(text="content2",modifier=Modifier.align(Alignment.TopCenter))Text(text="content3",modifier=Modifier.align(Alignment.TopEnd))Text(text="content4",modifier=Modifier.align(Alignment.CenterStart))Text(text="content5",modifier=Modifier.align(Alignment.Center))Text(text="content6",modifier=Modifier.align(Alignment.CenterEnd))Text(text="content7",modifier=Modifier.align(Alignment.BottomStart))Text(text="content8",modifier=Modifier.align(Alignment.BottomCenter))Text(text="content9",modifier=Modifier.align(Alignment.BottomEnd))}
  1. Top、CenterVertically、Bottom:Row 的 verticalAlignment 使用
Row(modifier=Modifier.fillMaxSize().background(Color.LightGray).padding(16.dp),horizontalArrangement=Arrangement.Center,verticalAlignment=Alignment.CenterVertically){Text(text="1",modifier=Modifier.padding(4.dp))Text(text="12",modifier=Modifier.padding(4.dp))Text(text="123",modifier=Modifier.padding(4.dp))}
  1. Start、CenterHorizontally、End:Column 的 horizontalAlignment 使用
Column(modifier=Modifier.fillMaxSize().background(Color.LightGray).padding(16.dp),verticalArrangement=Arrangement.Center,horizontalAlignment=Alignment.CenterHorizontally){Text(text="test123",modifier=Modifier.padding(4.dp))Text(text="test123test123",modifier=Modifier.padding(4.dp))Text(text="test123test123test123",modifier=Modifier.padding(4.dp))}

二、Arrangement

  • Arrangement 用于控制子元素排列方式
说明
Top顶部对齐
Center垂直居中
Bottom底部对齐
SpaceEvenly等间距分布
SpaceBetween两端对齐,中间均匀分布
SpaceAround均匀分布

三、Carousel

dataclassCarouselItem(valid:Int,@DrawableResvalredId:Int,valdescription:String)valitems=remember{listOf(CarouselItem(0,R.drawable.img1,"img1"),CarouselItem(1,R.drawable.img2,"img2"),CarouselItem(2,R.drawable.img3,"img3"),CarouselItem(3,R.drawable.img4,"img4"),CarouselItem(4,R.drawable.img5,"img5"),)}HorizontalUncontainedCarousel(state=rememberCarouselState{items.count()},// CarouselState 实例,使用 `rememberCarouselState { itemCount }` 创建,其中 itemCount 是轮播界面中的项的总数itemWidth=186.dp,// 定义轮播界面中每个项的宽度(固定宽度)itemSpacing=8.dp,// 定义轮播界面中相邻项之间的间距modifier=Modifier.fillMaxWidth().wrapContentHeight(),contentPadding=PaddingValues(horizontal=16.dp,vertical=16.dp),// 定义轮播界面中内容的内边距,确保内容不贴边){itemIndex->valitem=items[itemIndex]Image(modifier=Modifier.height(205.dp).maskClip(MaterialTheme.shapes.extraLarge),// 使用圆角形状裁剪图片painter=painterResource(id=item.redId),// 加载 drawable 资源contentDescription=item.description,contentScale=ContentScale.Crop)}
dataclassCarouselItem(valid:Int,@DrawableResvalredId:Int,valdescription:String)valitems=remember{listOf(CarouselItem(0,R.drawable.img1,"img1"),CarouselItem(1,R.drawable.img2,"img2"),CarouselItem(2,R.drawable.img3,"img3"),CarouselItem(3,R.drawable.img4,"img4"),CarouselItem(4,R.drawable.img5,"img5"),)}HorizontalMultiBrowseCarousel(state=rememberCarouselState{items.count()},// CarouselState 实例,使用 `rememberCarouselState { itemCount }` 创建,其中 itemCount 是轮播界面中的项的总数preferredItemWidth=186.dp,// 定义轮播界面中每个项的宽度(首选宽度)itemSpacing=8.dp,// 定义轮播界面中相邻项之间的间距modifier=Modifier.fillMaxWidth().wrapContentHeight(),contentPadding=PaddingValues(horizontal=16.dp,vertical=16.dp),// 定义轮播界面中内容的内边距,确保内容不贴边){itemIndex->valitem=items[itemIndex]Image(modifier=Modifier.height(205.dp).maskClip(MaterialTheme.shapes.extraLarge),// 使用圆角形状裁剪图片painter=painterResource(id=item.redId),// 加载 drawable 资源contentDescription=item.description,contentScale=ContentScale.Crop)}

四、Checkbox

valcontext=LocalContext.currentvarcheckedbyremember{mutableStateOf(true)}Box(modifier=Modifier.fillMaxSize(),contentAlignment=Alignment.Center){Checkbox(checked=checked,onCheckedChange={checked=it Toast.makeText(context,"checked:$checked",Toast.LENGTH_SHORT).show()})}

五、TriStateCheckbox

1、基本介绍
  • TriStateCheckbox 继承 Checkbox 但增加中间状态,用于表示三种状态
状态说明
On所有子项都选中,显示对勾(√)
Off没有任何子项选中,显示空框
Indeterminate子项中既有选中又有取消选中,显示减号(-)
  • TriStateCheckbox 常用于嵌套复选框的父级控制,适用于如下场景
  1. 文件管理器全选 / 部分选

  2. 表格批量操作

  3. 设置项的多级控制

2、演示
valchildCheckedStates=remember{mutableStateListOf(false,false,false)}valparentState=when{childCheckedStates.all{it}->ToggleableState.On// 全都是 truechildCheckedStates.none{it}->ToggleableState.Off// 没有任何 trueelse->ToggleableState.Indeterminate}Column(modifier=Modifier.fillMaxSize(),horizontalAlignment=Alignment.CenterHorizontally,verticalArrangement=Arrangement.Center){Row(verticalAlignment=Alignment.CenterVertically,){Text("Select all")TriStateCheckbox(state=parentState,onClick={// 当 parentState 不等于 On 时,即状态是 Off 或 Indeterminate 时,所有子项设置为选中// 当 parentState 等于 On 时,所有子项设置为取消选中valnewState=parentState!=ToggleableState.On childCheckedStates.forEachIndexed{index,_->childCheckedStates[index]=newState}})}childCheckedStates.forEachIndexed{index,checked->Row(verticalAlignment=Alignment.CenterVertically,){Text("Option${index+1}")Checkbox(checked=checked,onCheckedChange={isChecked->childCheckedStates[index]=isChecked})}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 22:53:04

“我们数据太少,做不了风控?”——这可能只是个借口

“我们数据太少,做不了风控。”在金融科技行业多年,我听过太多团队用这个理由解释产品迭代缓慢、风控效果不佳。有意思的是,说这话的团队往往已经积累了数万甚至数十万用户。这真的只是个数据量问题吗? 文章目录 一、数据量≠数据价值 二、小数据也能做大风控 1 内部数据金…

作者头像 李华
网站建设 2026/4/15 12:52:05

Tensorflow数据增强(三):高级裁剪

基础裁剪方式的局限性 1. Center Crop(中心裁剪) 特点: 固定从图像中心裁剪不引入随机性 问题: 对目标偏移极其敏感无法模拟真实场景中目标位置变化对检测、分割任务几乎无帮助 2. Random Crop(随机裁剪) 特…

作者头像 李华
网站建设 2026/4/7 12:55:19

提升自己价值和稀缺性:同一句脏话,下属说就是顶嘴,领导说就是个性:人性的核心是趋利避害,所有的“干净与肮脏”“合理与不合理”,都是利益和价值的权衡,而非绝对的道德判断

撕开人性真相:没有绝对干净,只有利益权衡|突破人性内耗指南 目录 撕开人性真相:没有绝对干净,只有利益权衡|突破人性内耗指南 先拆底层逻辑:你看到的“双标”,本质是3个核心真相 第一个逻辑:不是“肮脏不可接受”,是“价值不够支撑包容” 第二个逻辑:不是“人性虚伪…

作者头像 李华
网站建设 2026/4/16 7:48:48

高等教育AI辅助教学:从理论到实践的架构设计全攻略

高等教育AI辅助教学架构设计全攻略:从理论模型到落地实践 一、引言:当AI遇到高等教育的“痛点” 清晨8点,某高校计算机系的李老师抱着一摞作业走进教室。看着台下40位基础参差不齐的学生,他陷入了两难:讲得太深&…

作者头像 李华
网站建设 2026/4/16 7:45:03

C++之多重继承

文章目录 名字冲突钻石继承(菱形继承)与虚继承 C允许一个类从一个或多个基类派生如果一个类只有一个基类,称为单一继承。如果一个类具有两个或两个以上的基类,就称为多重继承 class 派生类名:继承方式 基类名1&#x…

作者头像 李华