(原创)自定义控件:写一个瀑布流效果

文章介绍了如何在Android开发中实现一个自定义的瀑布流布局,该布局能够根据子View的宽度和高度动态摆放,并且针对TextView内容超出指定行数时自动显示省略号。作者详细讲解了测量和布局过程,包括动态测量子View、判断是否换行以及设置最大行数的逻辑。

效果展示

最近要业务中需要做一个瀑布流的效果,按理说正常的瀑布流网上已经有很多解决方案了。
但我还是想自己尝试写一下。
又因为这块要求有一点特殊,下面大概讲下需求:
首先子元素的对方肯定还是和其他瀑布流一样,按照子View的宽高动态摆放位置
然后这边子View都是Textview,其实就是各种标签
还有就是要求可以限制行数
比如子元素很多,只展示前两行
后面的用“…”表示(类似我们TextView里面文字过多时展示的效果一样)
具体效果如下:
在这里插入图片描述
可以看到最后的一个标签的内容是省略号
如果规定是三行,并且每超出规定行数,效果是这样的(红色背景色是我自己加的):
在这里插入图片描述
那么开干

测量代码

这边先定义了两个变量:childMarginRight 和chilMarginBottom
主要是来控制子View之间的间距的
还有一个mMaxLines控制最大行数
这边思路是:动态测量子View,当超过两行时,把最后一个子View的内容改为省略号
先看测量方法:

  override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    val widthSize = MeasureSpec.getSize(widthMeasureSpec)
    val widthMode = MeasureSpec.getMode(widthMeasureSpec)
    val heightSize = MeasureSpec.getSize(heightMeasureSpec)
    val heightMode = MeasureSpec.getMode(heightMeasureSpec)
    val childCount = childCount
    var lineWidth = 0
    var lineHeight = 0 //单行最大的高度
    var width = 0
    var height = 0 //总高度
    var lineCount = 1 // 当前行数
    for (i in 0 until childCount) {
      val child = getChildAt(i)
      measureChild(child, widthMeasureSpec, heightMeasureSpec)
      val childWidth = child.measuredWidth + childMarginRight
      val childHeight = child.measuredHeight
      if (lineWidth + childWidth > widthSize) { // 换行
        lineWidth = 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值