自定义ViewGroup之FlowLayout

一个FlowLayout带你学会自定义ViewGroup 在Android的世界里,系统是没有提供类似FlowLayout布局的容器的。当然了,现在官方给我们提供了更强大也更复杂的FlexLayout了。不过嘛,本篇博客是总结一个自定本篇博客是总结一个自定义ViewGroup的实现流程,所以需要找一个难易适中的实例来进行分析,也就是FlowLayout了。 阅读详情

 

先看看效果图:

先自定义一个类TestViewGroup,继承自ViewGroup,重写onMeasure、onLayout方法。

一、重写onMeasure方法

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

1、获取该ViewGroup的尺寸信息

int widthSize = MeasureSpec.getSize(widthMeasureSpec);

2、测量子view

measureChildren(widthMeasureSpec, heightMeasureSpec);

3、遍历子view

4、获取子view尺寸信息

5、设置每行每列的宽高信息

6、设置子view的四个顶点尺寸信息

7、最后设置setMeasuredDimension

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        //测量子View
        measureChildren(widthMeasureSpec, heightMeasureSpec);
        //记录总宽、总高:初始值为 -50,因为后面间距每个需要增加50
        int lineWidth = -widthSpacing;
        int lineHeight = -heightSpacing;
        //子View的宽高
        int cHeight;
        int cWidth;
        //遍历子View
        for (int i = 0; i < getChildCount(); i++) {
            View view = getChildAt(i);
            //获取每个View的实际宽
            cWidth = view.getMeasuredWidth();
            cHeight = view.getMeasuredHeight();
            if (lineWidth + cWidth  > widthSize) {
                //如果超出父布局,则换行,高度新增,宽度从0开始:每次竖向距离增加50
                lineHeight = lineHeight + cHeight + heightSpacing;
                lineWidth = -widthSpacing;
            } else {
                //否则使用原有的宽高
                lineHeight = Math.max(lineHeight, cHeight);
            }
            //宽度累加:增加50间距,横向距离
            lineWidth = cWidth + widthSpacing + lineWidth;
            //设置边距
            view.setLeft(lineWidth - cWidth);
            view.setRight(lineWidth);
            view.setTop(lineHeight - cHeight);
            view.setBottom(lineHeight);
        }
        //宽高变化后进行设置
        setMeasuredDimension(widthSize, lineHeight);
    }

每个步骤上面有详细的步骤信息备注,上面的heightSpacing 为设置每行间距,widthSpacing为每列间距,这么默认可以设置一个默认值,也可以提供一个方法对外暴露来使用。

二、onLayout

遍历每个view逐个设置。

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            View view = getChildAt(i);
            if (view.getVisibility() != View.GONE) {
                //逐个绘制
                view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
            }
        }
    }

三、使用

这里直接写在XML里面,也可以动态添加布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="40dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="自定义ViewGroup"
        android:textColor="@android:color/black"
        android:textSize="24sp"/>

    <com.viewgroup.viewgroupdemo.TestViewGroup
        android:id="@+id/viewgroup"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:layout_marginTop="50dp">

        <TextView
            style="@style/textstyle"
            android:layout_height="30dp"
            android:text="铁总回应高铁飙车"/>

        <TextView
            style="@style/textstyle"
            android:text="腾讯大王卡"
            />

        <TextView
            style="@style/textstyle"
            android:text="苹果8降价"
            />

        <TextView
            style="@style/textstyle"
            android:text="王者荣耀6"
            />

        <TextView
            style="@style/textstyle"
            android:background="@drawable/shape_text_bg"
            android:text="张三2"
            />

       …………………………………………………………………………………………………………………………………………


    </com.viewgroup.viewgroupdemo.TestViewGroup>
</LinearLayout>

源代码地址:https://download.youkuaiyun.com/download/yoonerloop/10935103

今年最后一篇文章,祝大家新春快乐,万事如意!

 

 

Android自定义ViewGroup实战:打造FlowLayout标签流容器 在Android UI开发中,ViewGroup作为视图容器,承担着布局管理和事件分发的核心职责。系统提供的LinearLayout、RelativeLayout等布局在大多数场景下能够满足需求,但在面对复杂或特定布局逻辑时,如标签流(FlowLayout)、瀑布流等,便需要开发者进行自定义ViewGroup的实现。自定义ViewGroup的关键在于理解并重写其核心方法,如和onLayout()。这两个方法分别负责子视图的尺寸测量与位置排布。 阅读详情

相关推荐

FlowViewGroup

android 自定义ViewGroup 实现流式布局

Android开发者必须要了解的View布局过程(View的工作之Layout过程)

View的工作原理之layout过程 目录 1. 详细布局过程 1.1 布局过程到底要做什么? 1.2 布局相关的属性Frame 2. 自定义onLayout,简单实现FloatingButton 2.1 效果图 2.2 avtivity.xml 2.3 CustomFloatingView.java 1. 详细布局过程 1.1 布局过程到底要做什么? ...

Ung8023 3万+

envi5.3处理高分二号影像数据详细过程记录

全文根据此篇文章进行数据处理: tm影像辐射定标_高分二号影像数据预处理及裁剪过程 其他参考: 学习笔记---遥感影像辐射定标与大气校正 利用ENVI自带全球DEM数据计算区域平均高程 高分二号数据处理流程(有高分二号的数据信息) GF2有多光谱和全色两个数据,MSS是多光谱的,PAN是全色的,多光谱的分辨率低,全色的高,需要把这两个数据融合,融合之前需要做定标等处理,获取经纬度。 一、多光谱影像处理 1. 辐射定标 以这个为例: 其他路径\2022.4.2...

ligous的博客 5万+

Android 改变View位置 setLeft、etRight、setTop、setBottom等在API 11以下的替代方法

public final void setTop (int top) Sets the top position of this view relative to its parent. This method is meant to be called by the layout system and should not generally be called otherwise, bec

a15838319826的博客 1万+

Jupyter实战:解决ModuleNotFoundError之xgboost缺失问题

本文详细解析了在Jupyter Notebook中遇到ModuleNotFoundError: No module named 'xgboost'错误的完整解决方案。通过诊断环境、使用pip正确安装xgboost、配置Python路径以及最终验证,帮助用户彻底解决模块缺失问题,并理解Jupyter内核与Python环境的关系,提升问题排查能力。

weixin_29064103的博客 384

告别外置天线!手把手教你用HFSS仿真设计一个20x40mm的433MHz PCB蛇形天线

本文详细介绍了如何使用HFSS仿真工具设计一个20x40mm的433MHz PCB蛇形天线,解决物联网设备小型化中的天线集成难题。通过对比外置天线与PCB天线的性能差异,深入解析蛇形天线的电磁学原理,并提供从建模到优化的全流程实战指南,帮助工程师实现高效、低成本的微型化天线设计。

weixin_30606461的博客 429

可以下拉刷新,上拉加载更多的RecyclerView

一、前言            在移动开发过程中,当我们遇到信息展示的时候,往往会选择使用列表的形式。那在Android开发中,我们则会选用ListView来实现这种需求。但是随着Google的不断更新,它为我们提供了新的选择--RecyclerView。由于RecyclerView扩展性比较强,它的一些功能需要使用者自己动手去实现,举个例子:ListView中的headerView与foote

飞鸟与游鱼的博客 1211

微服务架构的实施与挑战:前提判断、三种落地模式、收益兑现与风险应对

微服务是用运维复杂度换取演进自由度的一笔交易,是否划算取决于系统复杂度是否越过生产率曲线的交叉点。本文先给出实施前提:微服务溢价的六项成本、四项前置能力、康威定律与领域边界,并附就绪度自检表;再拆解三种落地模式:以绞杀者为代表的渐进剥离与数据五级迁移、以模块化单体起步的绿地建设、新旧并行的混合式集成;随后逐项审视六大技术优势与组织收益的兑现条件,系统梳理分布式谬误、分布式单体、Saga与幂等、弹性容错、可观测性、契约测试等挑战与对策,最后给出四阶段落地路线、DORA四项度量与常见反模式清单。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

android 自定义flowlayout,Android 自定义ViewGroup——FlowLayout流式标签

最近一直在学习自定义View和自定义ViewGroup的东西,今天没事干就研究了一下FlowLayout,记录下实现步骤,参考自鸿洋博客AndroidStudio使用在根projcet的build.gradle中添加.maven { url 'https://jitpack.io' }在项目的build.gradle添加:compile 'com.github.superSp:FlowLayout...

weixin_39607447的博客 176

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 153

【深度学习新浪潮】近三年垂域大模型研究与产品进展全景洞察(2022-2025)

近三年来,垂域大模型完成了从技术探索到产业落地的关键跨越,在多个行业实现效率提升与价值创造。面对数据治理、技术适配、生态建设等挑战,未来需要通过技术创新、标准制定、人才培养等多维度发力,推动垂域大模型向更高效、更可靠、更普惠的方向发展。随着"人工智能+"行动的深入推进,垂域大模型将成为数字经济与实体经济深度融合的核心驱动力,为产业智能化升级注入持续动能。

专注:太空算力、AI infra、异构调度、大模型成本工程 786

自定义ViewGroup系列---流式布局FlowViewGroup

本篇继续ViewGroup系列来讲述自定义ViewGroup的流程。本篇要讲述的是流式布局。 在Java Swing中,有一种布局,叫流式布局,这种布局的特点是子组件按照从左到右,从上到下的顺序依次排序,如果一行放不下了,自动显示到下一行。Android中并没有提供这样的布局,本节,我们将一起来实现这种流式布局FlowViewGroup。 对于FlowViewGroup来说,有两个难点: 1. 计算子组件的排布后的宽度和高度 FlowViewGroup的宽度为wrap_content时计算逻辑如下 meas

u010869159的博客 293

Android 13.0 USB 麦克风音频采集优化:解决延时、杂音和无声问题

摘要:本文针对Android智能会议设备中USB麦克风存在的三大问题(录音延时、概率性杂音和无声)进行了深入分析和优化。通过预填充静音帧降低90%启动延时,分离采集/播放互斥锁消除杂音,采用持久化配置解决无声问题,并新增状态通知机制提升用户体验。优化后测试显示:录音延时从1200-2000ms降至100-200ms,故障率降至0%,CPU占用降低30%。该方案适用于各类USB音频设备和视频会议系统,为低延时音频采集提供了可靠解决方案。

ip0417的博客 228

自定义ViewGroup—FlowLayout

今天在网上看到两篇关于自定义Flowlayout的实现方式,自己按着两篇文章的思路也尝试写个demo学习一下,最后实现了效果。这个功能实现起来不算太复杂,主要是父容器的高度和换行的计算。下面是我最终实现的效果图以及源码. 项目源码 package com.hdd.androidreview.customView; import android.annotation.SuppressLint; ...

weixin_34195546的博客 116

【Codex】Codex安装+DeepSeek API接入;无需登录,手把手带你使用codex

好多人使用codex时都卡在验证码登录那一步,今天就来介绍一种方法,不需要登录ChatGPT的账号,自然也就不需要手机验证码了;接入DeepSeek的api,一样可以丝滑使用codex;记录从零开始安装使用codex以及DeepSeek API接入的整个过程。不需要登录openAI;

AnChenliang_1002的博客 3529

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android 自定义ViewGroup之实现FlowLayout-标签流容器

本篇文章讲的是Android 自定义ViewGroup之实现标签流式布局-FlowLayout,开发中我们会经常需要实现类似于热门标签等自动换行的流式布局的功能,网上也有很多这样的FlowLayout,但不影响我对其的学习。和往常一样,主要还是想总结一下自定义ViewGroup的开发过程以及一些需要注意的地方。按照惯例,我们先来看看效果图 一、写代码之前,有几个是问题是我们先要弄清楚的: 1、什

Angelica 7781

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android FlowLayout实现流式布局 kotlin实现FlowLayout 自定义ViewGroup

最近在看viwe的自定义,看到蛮多讲解FlowLayout自定义ViewGroup的例子,然后回顾了一下《Android自定义控件开发入门与实战》里面的这个例子,想找一个kotlin的顺便看看,但是都没有,所以就写了这个博客记录一下 自定义view的文章应该很多,我就简单记录一下重点 一个是用java写的 一个是用kotlin写的 最近在学习kotlin 效果图 一、 View的绘制一般遵循 构造函数->onMeasure()(测量View的大小)-onSizeChanged()()->onL

小木子102 730

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

自定义ViewGroup——实战,实现FlowLayout

整理总结自鸿洋的博客:http://blog.csdn.net/lmj623565791/article/details/38352503/ 一、FlowLayout介绍 所谓FlowLayout,就是控件根据ViewGroup的宽,自动的往右添加,如果当前行剩余空间不足,则自动添加到下一行。有点像所有的控件都往左飘的感觉,第一行满了,往第二行飘~所以也叫流式布局。Android并没有提供流式

可乐淘的专栏 1602

Android 自定义ViewGroup之FlowLayout流式布局

简介        Android自定义View,ViewGroup是在开发中使用的比较多的,学习和掌握自定View,是中高级开发必须掌握的技能,本文使用一个自定义FlowLayout,来介绍自定义ViewGroup的流程与需要注意的地方 实践 我们先来看看最后的实现效果 接下来我们来实现这个效果,首先我们新建一个类,继承至ViewGroup,并且重写其onMeasure和onLayout两个方法,ViewGroup有4个构造方

chxip的博客 424

自定义ViewGroup的一个综合实践 FlowLayout

效果

Android_Study_OK的博客 346

自定义ViewGroup--实现FlowLayout

自定义ViewGroup–实现FlowLayout 基本流程 0.自定义容器类继承ViewGroup 需要实现4个构造函数 public class FlowLayout extends ViewGroup { // 子View二维列表 List<List<View>> allChild = new ArrayList<>(); // 每行的高度,取每行的最大值 List<Integer> itemHeightList = ne

d0d0bird的博客 256

android 自定义flowlayout,Android 自定义ViewGroup之实现FlowLayout-标签流容器

本篇文章讲的是Android 自定义ViewGroup之实现标签流式布局-FlowLayout,开发中我们会经常需要实现类似于热门标签等自动换行的流式布局的功能,网上也有很多这样的FlowLayout,但不影响我对其的学习。和往常一样,主要还是想总结一下自定义ViewGroup的开发过程以及一些需要注意的地方。此文章已经同步到优快云啦,欢迎访问我的博客按照惯例,我们先来看看效果图这里写图片描述一...

weixin_33765908的博客 328

自定义ViewGroup,流式布局FlowLayout

本文参考了【张鸿洋的博客】: Android 手把手教您自定义ViewGroup(一)和Android 自定义ViewGroup 实战篇 -> 实现FlowLayout 在很多应用里面,我们能看到类似于这样的流式 用现有的控件我们实现这种动态适应的布局很麻烦,对于如何比较简单的去实现这种布局,就需要我们去自定义ViewGroup了实现步骤一、新建一个FlowLayout类,继承ViewGrou

krubo的博客 869

Android 自定义viewGroup学习之FlowLayout的实现

Android 自定义viewGroup学习之FlowLayout的实现最近在学习自定义的viewGroup,刚接触,是真的难,看了洪洋大神的博客,收益多多,现在记录一下我对洪洋大神这篇文章Android 自定义ViewGroup 实战篇 -> 实现FlowLayout的理解。首先,viewGroup存在的目的是对其子view的管理,为其子view添加显示、响应的规则。因此,自定义的viewGrou

Gcalolin的博客 898

android-- 一个FlowLayout带你学会自定义ViewGroup

一个简单的自定义ViewGroup:流布局FlowLayout的实现过程,将自定义控件知识储备-View的绘制流程和自定义控件知识储备-LayoutParams的那些事里的知识点结合起来,付诸实践。 1. 前言 早在学习Java的Swing基础知识的时候,就见到过里面的流布局FlowLayout,基本的效果就是让加入此容器的控件自左往右依次排列,如果当前行的宽度不足以容纳下一个控件,就会将此控

zzzzzdddddxxxxx的专栏 848

自己实现FlowLayout来教你自定义ViewGroup

关于FlowLayout的实现网上的文章已经太多了,但是,俗话说,实践出真知,对于我这样的新手,自己写一个还是很有必要的,写完发现很多大神们不曾提及的小知识点,在这里还是要分享一下。 首先先看一张典型的View的在viewgroup中的摆放图 这是一个viewgroup和view的标配属性,接下来我们的自定义ViewGroup将围绕这张图展开。 自定义一个完整的viewgroup(支持marg

starry_night123的博客 314
上一篇: 从源码角度分析View的绘制流程
下一篇: Activity异常关闭时数据的存储和恢复过程分析
一杯清泉
博客等级 码龄11年 314粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值