Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >AutoFlowLayout:多功能流式布局与网格布局控件

AutoFlowLayout:多功能流式布局与网格布局控件

作者头像
陈宇明
发布于 2020-12-15 07:34:16
发布于 2020-12-15 07:34:16
7940
举报
文章被收录于专栏:设计模式设计模式

作者博客

http://www.jianshu.com/u/0fa6f5d09040

源码地址

https://github.com/LRH1993/AutoFlowLayout

文章目录

  • 前言
  • 应用场景
  • 实现效果
  • 使用
  • 原理

0

前言

近期工作需要用到流式布局,网上也有很多关于这方面的资料。发现流式布局与网格布局的自定义很有意思,是学习自定义控件的一个很好的方式,所以就撸了个几百行代码的控件,既实用又具有学习价值。

1

应用场景

流式布局,在很多标签类的场景中可以用的;而网格布局在分类中以及自拍九宫格等场景很常见。如下所示:

如此使用频繁而又实现简单的控件,怎能不自己撸一个呢?控件,还是定制的好啊。

2

实现效果

先介绍下自己撸的这个控件的功能及效果。

1.功能

流式布局

  • 自动换行
  • 行数自定:单行/多行
  • 支持单选/多选
  • 支持行居中/靠左显示
  • 支持添加/删除子View
  • 支持子View点击/长按事件

网格布局

  • 行数/列数自定
  • 支持单选/多选
  • 支持添加/删除子View
  • 支持子View点击/长按事件
  • 支持添加多样式分割线及横竖间隔

2.效果

下面以gif图的形式展现下实现的效果,样式简单了些,不过依然能展示出这个简单控件的多功能实用性。

流式布局

网格布局

最后一个是带间隔以及分割线的,由于录屏原因,只在跳过去的一瞬间显示了粉红色的一条线。真实如下图所示,可以定义横竖间距的大小,以及分割线的颜色,宽度。

3

使用

1.添加依赖

①.在项目的 build.gradle 文件中添加

②.在 module 的 build.gradle 文件中添加依赖

2.属性说明

下表是自定义的属性说明,可在xml中声明,同时有对应的get/set方法,可在代码中动态添加。

3.使用示例

布局

代码设置数据

与ListView,GridView使用方式一样,实现FlowAdapter即可。

4

原理

ViewGroup的测量、布局及绘制顺序如下所示:

详细的自定义View原理参考:图解View测量、布局及绘制原理http://www.jianshu.com/p/3d2c49315d68

下面具体介绍自定义实现网格布局的过程。

1.重写generateLayoutParams()方法

因为我们要在onMeasure以及onLayout的过程中,测量子View的margin,所以要重写该方法,并返回MarginLayoutParams。

2.onMeasure过程

主要针对wrap_content情况下,要逐行逐列的测量每个子View的宽高,padding,margin以及横竖间距,来获得最终ViewGroup的宽高。

3.onLayout过程

网格布局默认所有子View的宽高一致,先推算出每个子View的平均宽高,然后逐个推算每个子View的left,top,right,bottom位置,调用child.layout()进行子View布局。

4.dispatchDraw过程

绘制分割线得问过程,需要逐个对子View进行绘制分割线。所以重写dispatchDraw()方法。因为不需要对自己进行绘制,所以不需要重写onDraw()方法。 需要额外注意下,绘制过程中,考虑横竖间距的大小,这种情况下默认不考虑margin。

绘制流式标签的过程类似,一样的简单。不过通过实现的过程,确实加深了对自定义ViewGroup的理解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码个蛋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AutoFlowLayout-多功能流式布局与网格布局控件
近期工作需要用到流式布局,网上也有很多关于这方面的资料。发现流式布局与网格布局的自定义很有意思,是学习自定义控件的一个很好的方式,所以就撸了个几百行代码的控件,既实用又具有学习价值。 一、AutoFl
非著名程序员
2018/02/09
1.4K0
AutoFlowLayout-多功能流式布局与网格布局控件
自定义FlowLayout,android flowLayout实现
我想大家在开发过程中都碰到过这样的需求,类似标签展示,要展示如上图效果,这里面的数据不确定每项字数,有的非常长,有的很短,数据动态填充。
再见孙悟空_
2023/02/10
3720
自定义FlowLayout,android flowLayout实现
一起撸个简单粗暴的Tv应用主界面的网格布局控件(上)
这一篇是真的隔了好久了~~,也终于可以喘口气来好好写博客了,这段时间实在是忙不过来了,迭代太紧。好,废话不多说,进入今天的主题。
请叫我大苏
2018/05/17
8770
一起撸个简单粗暴的Tv应用主界面的网格布局控件(上)
手写自定义View—流式布局
先onMeasure()测量 、 再onLayout()布局 、最后onDraw()绘制。
没关系再继续努力
2021/12/12
5100
自定义View三问—字节真题
星期一的早上,还没从假期缓过来的你,遇到产品给的新需求,要做一个你没看过的View,是不是有点崩溃。哎,抹干眼泪,拿起自定义View开始埋头苦干吧~
码上积木
2020/10/29
5490
自定义View三问—字节真题
自定义控件基础 之 3.4 ViewGroup的测量 & 3.5 ViewGroup的绘制
之前分析中说了,ViewGroup会去管理其子View,其中一个管理项目就是负责子View的显示大小。当ViewGroup的大小为wrap_content时,ViewGroup就需要对子View进行遍历,以便获得所有子View的大小,从而来决定自己的大小。而在其他模式下则会通过具体的指定值来设置自身的大小。   ViewGroup在测量时通过遍历所有子View,从而调用子View的Measure方法来获得每一个子View的测量结果,前面所说的对View的测量,就是在这里进行的。   当子View测量完毕后,就需要将子View放到合适的位置,这个过程就是View的Layout过程,同样是使用遍历来调用子View的Layout方法,并制定其具体显示的位置,从而来决定其布局位置。   在自定义ViewGroup时,通常会去重写onLayout()方法来控制其子View显示位置的逻辑。同样,如果需要支持wrap_content属性,那么它还需要重写onMeasure()方法,这点与View是相同的。
凌川江雪
2018/09/13
5310
Android开发之漫漫长途 番外篇——自定义View的各种姿势2
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是Android中高级开发工程师。
LoveWFan
2018/08/07
5810
Android开发之漫漫长途 番外篇——自定义View的各种姿势2
带你彻底搞懂-View的工作原理!
1.ViewRoot对应ViewRootImpl类,是连接WindowManager和DecorView的纽带。View的三大流程是通过ViewRoot完成的。 在ActivityThread中,当Activity对象被创建完毕时,会将DecorView添加到Window中,同时会创建ViewRootImpl,且ViewRootImpl和DecorView会建立关联。如下代码,WindowManagerGlobal的addView()方法:
胡飞洋
2020/07/23
1.2K0
带你彻底搞懂-View的工作原理!
我奶奶都能懂的UI绘制流程(下)!
前言 上回咱们说到ViewRootImpl.performTraversals()这个方法,从这里开始,会进入真正的View的绘制流程。第一次看的同学先去隔壁我奶奶都能懂的UI绘制流程(上)!汲取预备
我就是马云飞
2018/02/05
6920
我奶奶都能懂的UI绘制流程(下)!
自定义View必备知识-View绘制流程
View的绘制是从上往下一层层迭代下来的。DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下,依次measure(测量),layout(布局),draw(绘制)。
Android技术干货分享
2019/05/29
1.8K0
自定义View必备知识-View绘制流程
android 自定义控件那些事
概述 在android应用开发过程中,固定的一些控件和属性可能满足不了开发的需求,所以在一些特殊情况下,我们需要自定义控件与属性。而自定义控件通常有两种:自定义View和自定义ViewGroup。 V
xiangzhihong
2018/02/06
7380
android 自定义控件那些事
Android自定义View中的onMeasure、onLayout和onDraw方法解析
在Android开发中,我们经常需要自定义View来实现特定的界面效果。要实现一个自定义View,我们需要了解并掌握onLayout、onMeasure和onDraw这三个关键方法。本文将详细介绍这三个方法的用法和解释,并给出两个自定义View的案例。
陆业聪
2024/07/23
7030
Android自定义View中的onMeasure、onLayout和onDraw方法解析
Android-UI布局---onLayout、layout方法
onLayout方法是ViewGroup中子View的布局方法,用于放置子View的位置。放置子View很简单,只需在重写onLayout方法,然后获取子View的实例,调用子View的layout方法实现布局。在实际开发中,一般要配合onMeasure测量方法一起使用。
wust小吴
2019/07/08
2.6K0
一起撸个简单粗暴的Tv应用主界面的网格布局控件(下)
上一篇中我们已经一起学了怎么简单粗暴的撸个支持动态布局的网格控件出来,但在上一篇的介绍中,并没有学习实现网格控件的滑动效果,所以本篇就来讲讲,要如何让我们的网格控件可以支持自定义滑动策略。
请叫我大苏
2018/05/17
9890
Android 面试官:简述一下 View 的绘制流程,这个都答不出来就别想拿Offer了
作为一名Android开发者肯定明白View的地位,说它占据半壁江山也不为过,作为基石之一,搞明白它的加载流程是每个开发者都应该去做的,目前网络上很多关于View绘制流程的文章,有些质量也很高,但我还是想以自己的思路出一篇文章。相信读完你对View的工作机制以及自定义View会有一个全新的认识。
Android技术干货分享
2020/11/10
8.2K0
Android 面试官:简述一下 View 的绘制流程,这个都答不出来就别想拿Offer了
Android自定义控件总结
自定义控件分类: 1、使用系统控件,实现自定义的效果 2、自己定义一个类继承View ,如textView、ImageView等,通过重写相关的方法来实现新的效果 3、自己定义一个类继承ViewGroup,实现相应的效果 继承view类或viewgroup类,来创建所需要的控件。一般来讲,通过继承已有的控件来自定义控件要简单一点。 介绍下实现一个自定义view的基本流程 1.明确需求,确定你想实现的效果。 2.确定是使用组合控件的形式还是全新自定义的形式,组合控件即使用多个系统控件来合成一个新控件,你比如t
六月的雨
2018/05/14
1.4K0
重新复习Android View的绘制流程
PhoneWindow是Android系统中最基本的窗口系统,每个Activity会创建一个。同时,PhoneWindow也是Activity和View系统交互的接口。DecorView本质上是一个FrameLayout,是Activity中所有View的祖先。
老马的编程之旅
2022/06/22
4700
重新复习Android View的绘制流程
揭开Android视图绘制的神秘面纱
在Android的UI中,View是至关重要的一个组件,它是用户界面的基本构建块。在View的绘制过程中,涉及到很多重要的概念和技术。本文将详细介绍Android View的绘制过程,让你能够更好地理解和掌握Android的UI开发。
Rouse
2023/08/31
3350
揭开Android视图绘制的神秘面纱
View 的绘制过程
分别对应了:onMeasure() onLayout() onDraw 当然这个过程中也会调用许多其他的方法,都是作为辅助,大的流程就这三步。其中这三步内部的执行都是呈现树状结构,从根 View 开始循环递进,直到所有子 View 全部执行完毕。
开发者
2019/12/26
6680
View 的绘制过程
推荐阅读
相关推荐
AutoFlowLayout-多功能流式布局与网格布局控件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档