android 自动换行布局

2023-11-12

此方法是固定每行居中

使用
android:paddingLeft="@dimen/margin_common_10"
android:paddingRight="@dimen/margin_common_15"
进行调整左右间距
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

public class FlexBoxLayout extends ViewGroup {
    /**
     * 居中换行
     */
    public int foxheight= 5;//换行H间隙
    public FlexBoxLayout(Context context) {
        this(context, null);
    }

    public FlexBoxLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int maxWidth = MeasureSpec.getSize(widthMeasureSpec);
        int childCount = getChildCount();
        int x = 0,y = 0,row = 0,ih=0;
        for(int i = 0; i<childCount; i++){
            getChildAt(i).measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
            if(getChildAt(i).getMeasuredHeight()>ih)
            {
                ih = getChildAt(i).getMeasuredHeight();
            }
        }

        for (int index = 0; index < childCount; index++) {
            final View child = this.getChildAt(index);
            if (child.getVisibility() != View.GONE ) {
                child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
                // 此处增加onlayout中的换行判断,用于计算所需的高度
                int width = child.getMeasuredWidth();
                int height = ih;

                x += width;
                y = row * height + height;
                if (x > maxWidth) {
                    x = width;
                    row++;
                    ih = ih+foxheight;
                    height = ih;
                    y = row * (height) + height;
                }
            }
        }

        setMeasuredDimension(maxWidth, y);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        final int childCount = getChildCount();
        int maxWidth = r - l;
        int x = 0,y = 0,row = 0,ih=0;
        for(int i = 0; i<childCount; i++){
            getChildAt(i).measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
            if(getChildAt(i).getMeasuredHeight()>ih)
            {
                ih = getChildAt(i).getMeasuredHeight();
            }
        }

        for (int i = 0; i < childCount; i++) {
            final View child = this.getChildAt(i);
            if (child.getVisibility() != View.GONE ) {
                int width = child.getMeasuredWidth();
                int height = ih;
                x += width;
                y = row * height + height;
                if (x > maxWidth) {
                    x = width;
                    row++;
                    ih = ih+foxheight;
                    height = ih;
                    y = row * (height) + height;
                }
                if( child.getMeasuredHeight()< ih)
                {
                    child.layout((x - width) + getPaddingLeft(), (y - height)+(ih-child.getMeasuredHeight())/2 ,
                            x- + getPaddingRight(), y-(ih-child.getMeasuredHeight())/2);
                }else{
                    child.layout((x - width) + getPaddingLeft(),  y - height, x + getPaddingRight(), y);
                }
            }
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 自动换行布局 的相关文章

随机推荐

  • Pandas——读/写不同数据源的数据

    Pandas 读 写不同数据源的数据 一 读 写数据库数据 1 SQLAlchemy连接MySQL数据库 2 使用 read sql query read sql table read sql 函数 读 取数据库数据 3 使用 to sql
  • 全面总结机器学习超参数调优(附代码)

    公众号 尤而小屋作者 Peter编辑 Peter 大家好 我是Peter 本文的主题 机器学习建模的超参数调优 开局一张图 文章很长 建议直接收藏 一 什么是机器学习超参数 机器学习超参数是在开始学习过程之前设置值的参数 而不是通过训练得到
  • 导入elementui组件库

    1 在终端输入 vue add element 回车 选择按需加载 输入yes 回车 选择zh CN 回车 2 在plugins里面有一个element js 我们先去elementui官网看到快速上手 就可以看到按需引入 复制代码放到el
  • 搭建 react+ts+less+Antd 项目

    搭建 react ts less Antd 项目 一 文章目录 搭建 react ts less Antd 项目 一 前言 项目搭建流程 1 新建项目 2 暴露配置 3 支持less 4 支持ts 前言 项目搭建流程 1 新建项目 npx
  • 谷粒商城-分布式高级篇[商城业务-检索服务]

    谷粒商城 分布式基础篇 环境准备 谷粒商城 分布式基础 业务编写 谷粒商城 分布式高级篇 业务编写 持续更新 谷粒商城 分布式高级篇 ElasticSearch 谷粒商城 分布式高级篇 分布式锁与缓存 项目托管于gitee 一 商城业务 检
  • ckplayer html播放本地,vue中使用ckplayer播放器

    请选择视频源 获取视频中 请稍等 export default name components props sourceUrl type String default height type String default 550px dat
  • python统计套利_基于python的统计套利实战(二)之协整检验

    协整关系协整 Cointegration 理论是恩格尔 Engle 和格兰杰 Granger 在1978年提出的 平稳性是进行时间序列分析的一个很重要的前提 很多模型都是基于平稳下进行的 而现实中 很多时间序列都是非平稳的 所以协整是从分析
  • 智能优化算法改进-K-means聚类种群初始化附Matlab代码

    目录 0引言 一 K means聚类原理 二 K Means聚类算法步骤 三 K Means聚类原理图 编辑 四 K means聚类改进智能优化算法种群初始化效果图 4 1 初始种群数据图 4 2 K means聚类结果图 4 2 1 根据
  • VM虚拟机下 Ubuntu下摄像头显示安装

    安装 可通过PPA进行安装 ffmpeg sudo add apt repository ppa kirillshkrogalev ffmpeg next sudo apt get update sudo apt get install f
  • 浅谈Router和Route

    router 和 route 是在前端框架中用于管理和处理路由的两个关键概念 这两者之间的关系可以通过具体的代码来解释 在本示例中 我将使用 React 和 React Router 来说明它们之间的关系 Router 路由器 Router
  • DataPipeline丨DataOps的技术考量

    作者 DataPipeline CEO 陈诚 从 数据的资产负债表与现状 到 DataOps理念与设计原则 直至 DataOps的组织架构与挑战 我们对于DataOps的讨论已经进行了三周 不难发现 在此期间 我们探讨的话题始终围绕在上层建
  • SSR、SSE、SST、R2

    在MATLAB中 计算回归问题的拟合优度 或判定系数 可用 B BINT R RINT STATS regress Y X 指令 其中的STATS的第一个返回值即为R2 R2约接近于1 拟合效果越好 SSR为回归平方和 SSE为残差平方和
  • React官网入门项目井字棋游戏

    React官网里有很详细的教程 也有在线沙盒 但是写的东一榔头西一棒槌的 不适合新手入门 所以我还是建议大家可以先去看看阮一峰大神的React博客或者某硅谷的网课 这个网课讲的很详细 甚至详细到有些啰嗦 我大概是用20天把网课看完 然后再看
  • 进程信号(信号产生、注册、注销、处理),信号阻塞和volatile关键字

    文章目录 进程信号 信号产生 信号在进程中注册 信号在进程的注销 信号的处理 信号的处理方式 信号阻塞 如何阻塞一个信号 int sigprocmask int how sigset t set sigset t old int sigem
  • 从零开始制作Linux

    提到制作Linux 大家都能想到如雷贯耳 大名鼎鼎的Linux from scratch 但Linux from scratch的复杂性不是普通人能轻易掌握的 对于初学者来说 任何步骤出现不一致 会让初学者遇到挫拆 攻破LFS的信心越来越低
  • 【Linux命令】Linux复制时显示进度

    sudo rsync av progress src dest 效果如下图 更详细的使用 linux 命令 rsync 详解 yspg 217的博客 CSDN博客 linux rsync命令详解
  • 十四、计算机网络--iptables

    iptables只是个传参的工具 真正起作用的内核中的netfilter 1 默认的五种规则链 INPUT OUTPUT FORWARD POSTROUTING PREROUTING 2 默认的4个规则表 raw表 确定是否对该数据包进行状
  • 一文带你了解socket网络编程以及详解过程和原理

    创作不易 期望亲友们给个免费的就行 文章目录 一 什么是socket 二 TCP IP 三 socket原理 四 代码说明 五 API函数 一 什么是socket Socket 套接字 是计算机网络编程中的一种抽象概念 它提供了在网络上进行
  • OpenGL ES着色器语言(GLSL ES)规范 ——上篇

    文章目录 前言 OpenGL ES基础 一段基本的着色器代码 大小写和分号 数据值类型 命名规范 类型转换 运算符 矢量和矩阵 矢量和矩阵类型 矢量构造 访问 矩阵构造 访问 矢量矩阵运算规则 特殊类型 结构体和数组 结构体 数组 取样器
  • android 自动换行布局

    此方法是固定每行居中 使用 android paddingLeft dimen margin common 10 android paddingRight dimen margin common 15 进行调整左右间距 import and