Android怎么自定义ViewGroup多行多列效果
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍"Android怎么自定义ViewGroup多行多列效果",在日常操作中,相信很多人在Android怎么自定义ViewGroup多行多列效果问题上存在疑惑,小编查阅了各式资料,整理出简
千家信息网最后更新 2025年11月07日Android怎么自定义ViewGroup多行多列效果
这篇文章主要介绍"Android怎么自定义ViewGroup多行多列效果",在日常操作中,相信很多人在Android怎么自定义ViewGroup多行多列效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Android怎么自定义ViewGroup多行多列效果"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
先看下效果图
每行两个子孩子
每行一个子孩子
实现思路
自定义viewGroup,实现测量和布局,使控件适应业务场景。
测量
根据父控件的宽度,平均分给每个子孩子固定的宽度。高度就是行数乘以一个子孩子的高度,再加上空隙的高度。
根据子孩子个数计算行数
val rows = if (childCount % perLineChild == 0) { childCount / perLineChild } else { childCount / perLineChild + 1 }代码示例
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val width = MeasureSpec.getSize(widthMeasureSpec) for (i in 0 until childCount) { val child: View = getChildAt(i) if (child.visibility != GONE) { val lp = child.layoutParams val childWidthMeasureSpec = getChildMeasureSpec( widthMeasureSpec, 0, (width - (perLineChild - 1) * space) / perLineChild ) val childHeightMeasureSpec = getChildMeasureSpec( heightMeasureSpec, 0, lp.height ) child.measure(childWidthMeasureSpec, childHeightMeasureSpec) } } val rows = if (childCount % perLineChild == 0) { childCount / perLineChild } else { childCount / perLineChild + 1 } if (childCount > 0) { setMeasuredDimension( width, getChildAt(0).measuredHeight * rows + (rows - 1) * space ) } }布局
需要注意摆放的顺序和位置,每行摆放固定的个数,达到个数之后换行继续摆放
代码示例
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { var left = l var top = t children.forEachIndexed { index, view -> if (index % perLineChild == 0) { left = 0 if (index != 0) { top += view.measuredHeight top+=space } view.layout(left, top, view.measuredWidth + left, top + view.measuredHeight) } else { view.layout(left, top, view.measuredWidth + left, top + view.measuredHeight) } left += view.measuredWidth left += space } }完整代码
class MultiLineViewG @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : ViewGroup(context, attrs, defStyleAttr) { var perLineChild = 2 /** * 子孩子之间的空隙 */ var space = 10 override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val width = MeasureSpec.getSize(widthMeasureSpec) for (i in 0 until childCount) { val child: View = getChildAt(i) if (child.visibility != GONE) { val lp = child.layoutParams val childWidthMeasureSpec = getChildMeasureSpec( widthMeasureSpec, 0, (width - (perLineChild - 1) * space) / perLineChild ) val childHeightMeasureSpec = getChildMeasureSpec( heightMeasureSpec, 0, lp.height ) child.measure(childWidthMeasureSpec, childHeightMeasureSpec) } } val rows = if (childCount % perLineChild == 0) { childCount / perLineChild } else { childCount / perLineChild + 1 } if (childCount > 0) { setMeasuredDimension( width, getChildAt(0).measuredHeight * rows + (rows - 1) * space ) } } override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { var left = l var top = t children.forEachIndexed { index, view -> if (index % perLineChild == 0) { left = 0 if (index != 0) { top += view.measuredHeight top+=space } view.layout(left, top, view.measuredWidth + left, top + view.measuredHeight) } else { view.layout(left, top, view.measuredWidth + left, top + view.measuredHeight) } left += view.measuredWidth left += space } }}到此,关于"Android怎么自定义ViewGroup多行多列效果"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
孩子
效果
多行
学习
个子
个数
代码
高度
宽度
布局
控件
更多
示例
空隙
帮助
测量
实用
接下来
业务
两个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
ug数据库错误怎么办
浙江一站式软件开发供应
公安内网网络安全培训课件
北京讯听网络技术有限公司地址
江苏省网络安全承诺书
大学生网络安全教学设计
信息安全防护和网络安全防护
嵌入式软件开发是啥
服务器分几类
国内网络安全股票有哪些
昆山运营网络技术优势
幼儿园网络安全宣传周倡议书图片
河南网络技术分类五星服务
软件开发测试脸型发型
网络技术最后一题
任天堂服务器
嘉定区网络技术服务售后保障
求生之路官方服务器叫什么
什么表示web服务器控件
浪潮服务器管理口怎么打开
服务器 代理服务器
失落的方舟直升券服务器
时代网络安全技术研究院
如何用服务器挂网心云
信息安全防护和网络安全防护
数据库中数据模型是什么的集合
如何进入局域网服务器
网络安全法硕士论文
掌上明星服务器走丢了
包商银行软件开发待遇