效果:

@Composable
fun StaggeredGrid(modifier: Modifier = Modifier,content: @Composable () -> Unit
) {Layout(modifier = modifier, content = content) { measurables, constraints ->// 布局高度需要根据子元素的行数进行计算var layoutHeight = 0var sumWidth = 0var lineMaxHeight = 0// 不要进一步限制子元素,用给定的约束测量它们测量的子视图列表val placeables = measurables.mapIndexed { index, measurable ->// 测量每个子元素val placeable = measurable.measure(constraints)// 累加行中子元素的宽度, 当宽度大于允许的最大宽度时换行sumWidth += placeable.widthif (sumWidth > constraints.maxWidth) {// 如果width大于允许的最大宽度, 就另起一行sumWidth = placeable.width// 每行最高的子元素累加的高度就是布局高度layoutHeight += lineMaxHeight// 重置行中最大子元素高度lineMaxHeight = 0}// 记录每行最高的那个子元素高度lineMaxHeight = lineMaxHeight.coerceAtLeast(placeable.height)placeable}//当循环结束时加上最后一行的高度layoutHeight += lineMaxHeight//布局的高度根据子元素占用进行设置, 宽度以约束条件允许的最大宽度layout(constraints.maxWidth, layoutHeight) {// 跟踪放置子元素的 x 坐标var xPosition = 0// 跟踪放置子元素的 y 坐标var yPosition = 0// 将子元素放置在父布局中placeables.forEachIndexed { index, placeable ->// 在屏幕上定位项目placeable.placeRelative(x = xPosition, y = yPosition)// 记录放置到的 x 坐标xPosition += placeable.widthif (index < placeables.size && xPosition + placeables[index].width > constraints.maxWidth) {//如果当前行的子元素总宽度大于屏幕宽度就另起一行(注意加上将要放置的子元素宽度进行判断)xPosition = 0// 记录放置到的 y 坐标yPosition += placeable.height}}}}
}

使用:

StaggeredGrid {topics.forEach {Chip(text = it, modifier = Modifier.padding(6.dp).clickable(onClick = {Log.d("TAG", "onCreate: $it")}))}
}

Jetpack Compose 自定义流式布局相关推荐

  1. Adnroid 自定义流式布局

    一般常见的流式布局由两种,一种是横向的个数固定,列表按照竖向进行排列.另一种是横向先排,横向排满之后再竖向排列.而本框架实现是以第二种方式进行处理. 那么这个框架到底该如何使用呢? 首先引入资源 这里 ...

  2. android自定义流式布局思路,Android 自定义控件基础-流式布局

    什么是流式布局?其实我们在平时遇到过,只是有可能叫不出它的名字. 如图: 如上图,就是一个流式布局的样式. &esmp;这里,将记录一下怎么实现这个功能.其实实现这个功能的方法,就是自定义Vi ...

  3. android自定义view流布局,Android控件进阶-自定义流式布局和热门标签控件

    一.概述: 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧 类似的自定义换行流式布局控件.下 ...

  4. Android自定义流式布局-FlowLayout

    很多App在搜索页时都有对热门标签的一个排列,而Android官方没有对应的布局控件,所以自己写了一个流式布局(也称标签布局)--FlowLayout. 为了大家使用的方便,没有添加自定义属性,所以需 ...

  5. 自定义流式布局View

    //或者说直接for for (int i = 0; i < 20; i++) {             TextView txt = new TextView(this);          ...

  6. 自定义View----滑动刻度尺与流式布局 实例(四)

    2019独角兽企业重金招聘Python工程师标准>>> 近在系统学习自定义View这一块的知识,前面几篇基本都是理论知识,这篇博客着重从实战来加强对自定义View的理解与运用.实现的 ...

  7. 自定义 FlowLayout流式布局搜索框 加 GreenDao存取搜索记录,使用RecyclerView展示

    输入框布局的shape <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android ...

  8. Android自定义控件之流式布局

    效果图: 一.首先创建我 们的自定义流式布局 public class FlowLayoutView extends ViewGroup {public FlowLayoutView(Context ...

  9. Flutter: 弹性布局Flex(Expanded)、流式布局Wrap、Flow

    用Android原生实现流式布局[实现例如app的很多标签]需要自定义View继承自ViewGroup,然后代码量也不小. 相关自定义View实现流式布局,请参考这位老兄的博客: https://bl ...

最新文章

  1. python编程狮题库答案_‎Python编程狮-零基础学Python dans l’App Store
  2. 300php是多少人民币,GV300S登陆欧洲市场 售价约为3.82万人民币
  3. 为什么学计算机的人不用360,为什么会电脑的人都鄙视他人安装360?
  4. mysql怎么卸载干净
  5. java 微服务架构图_图解微服务架构演进
  6. matlab和keil下如何查找数组最大值的下标(角标)
  7. 增量学习——文章汇总
  8. cocos 躲避球游戏(2) --资源导入和碰撞检测
  9. [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中-es6-Object.defineProperty()定义属性...
  10. 安装BT5 backtrack5 linux 无线网卡驱动
  11. \(^_^)/ Effective java
  12. PDF转换来的word文件全是文本框怎么办?
  13. 模拟法庭教学实训软件QY-RJ11
  14. JVM学习笔记(宋红康老师课程)
  15. Intel Optane DC Persistent Memory Module (PMM)持久内存
  16. 多层商厦广播播音及背景音乐系统解决方案
  17. 个人设计web前端大作业~响应式游戏网站源码(HTML+CSS+Bootstrap)
  18. Symantec Ghost 8.3 DOS 版 下载
  19. LINQ To XML 入门(3)
  20. 四万字歌词分析:那些年,我们一起追的五月天到底在唱什么?

热门文章

  1. MySQL 解析单条查询
  2. 如何用excel批量新建文件夹并命名?
  3. C语言永真循环,c语言第六章总结 循环语句
  4. 2016大连理工大学计算机考研经验
  5. Unity 添加自己的Logo
  6. 国内BI工具五巨头有哪些?各自有哪些擅长的?
  7. Flyme 9.2系统更新:适配魅族17、18、18s系列
  8. Sunday 算法详解
  9. AngularJS进阶 十九 在AngularJS应用中集成百度地图实现定位功能
  10. 监控视频分发转发服务器性能,基于视频监控的分发服务器的研究与实现