Scratch螺旋艺术:用图形化编程探索生成艺术与数学之美
2026/6/2 13:48:02
一个典型的组合式UI架构,使用了Slot API 设计模式。图表示意:
MediaItemLayout (核心布局容器) ├── 参数: │ ├── leading: () -> Unit // 左侧内容 │ ├── center: () -> Unit // 中间内容 │ └── trailing: () -> Unit // 右侧内容(可选) │ ├── 内部结构: │ ├── Row (水平布局) │ │ ├── leading() // 左侧 │ │ ├── center() // 中间(有weight=1) │ │ └── trailing() // 右侧 │ └── HorizontalDivider // 分割线 │ └── 两种具体实现: ├── MediaItemNormal // 普通样式:封面 + 标题/副标题 └── MediaItemWithIndex // 带序号样式:序号 + 封面 + 标题/副标题 + 时长MediaItemLayout@ComposablefunMediaItemLayout(modifier:Modifier=Modifier,leading:@Composable()->Unit,// 左侧插槽center:@Composable()->Unit,// 中间插槽trailing:(@Composable()->Unit)?=null,// 右侧插槽(可选)showDivider:Boolean=true)这是一个布局容器组件,特点:
MediaItemNormal- 普通媒体项[ 封面图片 ] [ 标题 ] [ 副标题 ]用于:播放列表、专辑列表等不需要序号的地方
MediaItemWithIndex- 带序号媒体项[ 01 ] [ 封面图片 ] [ 标题 ] [ 3:45 ] [ 副标题 ]用于:歌曲列表、播客列表等需要显示序号和时长的场景
| 组件 | 功能 | 备注 |
|---|---|---|
IndexBox | 显示序号/播放动画 | 选中时显示音乐波动画 |
CoverBox | 显示封面图片 | 可显示播放动画 |
TitleSubtitleColumn | 标题和副标题 | 垂直排列,支持省略 |
DurationText | 显示时长 | 格式化时间显示 |
MediaItemUiModel (数据模型) ├── imageSrc → CoverBox ├── title → TitleSubtitleColumn ├── subTitle → TitleSubtitleColumn ├── index → IndexBox (仅MediaItemWithIndex) └── duration → DurationText (仅MediaItemWithIndex)MediaItemLayoutMediaItemLayout只负责布局CoverBox只负责封面显示TitleSubtitleColumn只负责文字显示// 可以轻松创建新的变体@ComposablefunMediaItemWithAction(uiModel:MediaItemUiModel,onActionClick:()->Unit){MediaItemLayout(leading={CoverBox(...)},center={TitleSubtitleColumn(...)},trailing={IconButton(onClick=onActionClick){Icon(Icons.Default.MoreVert,"更多")}})}// 普通样式MediaItemNormal(uiModel=MediaItemUiModel(imageSrc="album_cover_url",title="Song Title",subTitle="Artist Name"),isSelected=false,isPlaying=false)// 带序号样式MediaItemWithIndex(uiModel=MediaItemUiModel(imageSrc="album_cover_url",title="Song Title",subTitle="Artist Name",index=5,// 显示 "06"duration=225000// 显示 "3:45"),isSelected=true,// 显示播放动画isPlaying=true// 动画播放状态)这个文件展示了优秀的Compose架构设计:
MediaItemLayout是核心:作为布局容器,定义了整体的三栏结构MediaItemUiModel包含所有显示数据isSelected、isPlaying控制UI状态这种设计让代码: