Android自定义ViewGroup多行多列效果
作者:卖炭少年炭治郎 发布时间:2022-10-31 06:07:17
标签:Android,多行多列
本文实例为大家分享了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
}
}
}
来源:https://blog.csdn.net/weixin_38687303/article/details/120011073
0
投稿
猜你喜欢
- java 基础之JavaBean属性命名规范问题JavaBean属性名要求:前两个字母要么都大写,要么都小写下面我们来找找如果不遵循这个规范
- 淘宝返回的数据为:{"code":0,"data":{"country":&qu
- 1.Java Io流的概念,分类,类图。1.1 Java Io流的概念java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操
- 介绍本文介绍在Java程序中如何添加图片到excel表格,添加图片时可设置图片大小、位置、旋转、超链接、可选文本等,以及如何读取、删除exc
- lambda表达式以及并行流。官方承诺你写出来的代码更运行得更快。流会自动通过Fork/Join池并行地执行。我听过一些关于Java 8的主
- 1.Object类的equals()方法:比较两个对象是否是同一个对象,equals() 方法比较两个对象,是判断两个对象引用指向的是同一个
- 在测试过程中,我们有时候需要一个唯一不重复的值(比如order_id)。我之前一直用的时间戳+计数器/随机函数拼接,但是有时候效果不太好,今
- 五子棋游戏(Java),供大家参考,具体内容如下思路:1.首先创建一个棋盘,建立一个二维数组,此文中为一个15*15的二维数组,2.初始化棋
- 23种设计模式第十二篇:java模版方法模式定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义
- 推荐第三种方式,简单快捷不卡。第一种:jjdxm_updateGitHub地址:jjdxmashl/jjdxm_update效果图:点击立即
- 基于比较的排序算法基本原理及Java实现1. 七大基于比较的排序-总览1.1常见基于比较的排序分类1.2时间复杂度,空间复杂度以及稳定性。稳
- package com.cq2022.zago.base.util;import java.io.FileReader;import jav
- 本文实例为大家分享了Android Studio实现帧动画的具体代码,供大家参考,具体内容如下按一定的顺序播放静态的图片1、几张联系的图片2
- 目录前言简要1.Launcher向AMS发送启动Activity2.AMS启动Activity并通知Launcher进入Paused状态3.
- 此段小代码演示了spring aop中@Around @Before @After三个注解的区别@Before是在所拦截方法执行之前执行一段
- Viewpager通俗一点讲就是一个允许左右翻转带数据的页面的布局管理器,经常用来连接Fragment,它很方便管理每个页面的生命周期,使用
- 问题描述:输入一个链表的头结点,从尾巴到头反过来打印出每个结点的值。首先定义链表结点public class ListNode { &nbs
- 在处理网络请求时,有一部分功能是需要抽出来统一处理的,与业务隔开。登录校验可以利用spring mvc的 * Interceptor,实现H
- 提要本节继续给大家带来是显示提示信息的第三个控件AlertDialog(对话框),同时它也是其他Dialog的的父类!比如ProgressD
- 本文实例讲述了Android编程实现获取新浪天气预报数据的方法。分享给大家供大家参考,具体如下:新浪天气预报地址:http://php.we