Android怎么自定义ViewGroup多行多列效果
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍"Android怎么自定义ViewGroup多行多列效果",在日常操作中,相信很多人在Android怎么自定义ViewGroup多行多列效果问题上存在疑惑,小编查阅了各式资料,整理出简
千家信息网最后更新 2025年01月18日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安全错误
数据库的锁怎样保障安全
网络安全专业都学什么
网关数据库
软件开发苹果电脑
服务器每星期重启吗
注意网络安全的英文
服务器搭建架构
大话3手游服务器代理贵么
软件开发部好进吗
联想服务器 默认管理口
网络技术的伦理问题
安卓webdav服务器软件
我的世界无管理的服务器
创建数据库表设置utf8
数据库缓存技术类书籍
中国科中医药数据库
管家婆辉煌版数据库表结构
茂名货币量化交易软件开发
合适的esg数据库
ibm服务器代理
sql数据库教程
两台linux服务器免密
用网吧服务器玩游戏
联得系统网络安全管理制度
电视机顶盒显示ntp服务器异常
青岛有没有网络安全公司
数据库查询取消重复值
目前流行的数据库模型是什么
基因组序列 数据库
vivo安全服务器
屠龙网络技术