热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android自定义ViewGroup之FlowLayout(三)

这篇文章主要为大家详细介绍了Android自定义ViewGroup之FlowLayout,常用于关键字标签,搜索热词列表等功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本篇继续来讲自定义ViewGroup,给大家带来一个实例:FlowLayout。何为FlowLayout,就是控件根据ViewGroup的宽,自动的往右添加,如果当前行剩余空间不足,则自动添加到下一行,所以也叫流式布局。Android并没有提供流式布局,但是某些场合中,流式布局还是非常适合使用的,比如关键字标签,搜索热词列表等,比如下图:


定义FlowLayout

LayoutParams,onLayout的写法都和上一篇讲WaterfallLayout一模一样,在此不再赘述了,没看过的可以参照上一篇Android自定义ViewGroup(二)之WaterfallLayout。
在这里主要说的是onMeasure方法,注释见下方:

 @Override 
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
 // 获得它的父容器为它设置的测量模式和大小 
 int sizeWidth = MeasureSpec.getSize(widthMeasureSpec); 
 int sizeHeight = MeasureSpec.getSize(heightMeasureSpec); 
 int modeWidth = MeasureSpec.getMode(widthMeasureSpec); 
 int modeHeight = MeasureSpec.getMode(heightMeasureSpec); 

 int childCount = getChildCount();
 // 如果是wrap_content情况下,记录宽和高 
 int wrapWidth = 0; 
 int wrapHeight = 0; 
 //记录每一行的宽度,width不断取最大宽度 
 int lineWidth = 0; 
 //每一行的高度,累加至height 
 int lineHeight = 0;

 // 遍历每个子元素 
 for (int i = 0; i  sizeWidth) {
 //记录新行头一个标签坐标,为onLayout做准备
 lParams.left = 0;
 lParams.top = wrapHeight + lineHeight + vSpace;
 lParams.right = childWidth;
 lParams.bottom = lParams.top + childHeight;
 //取最大的,注意这里lineWidth是包括右侧hSpace的,需要减掉 
 wrapWidth = Math.max(lineWidth - hSpace, childWidth); 
 // 重新开启新行,开始记录,可以看到行宽包括最右侧hSpace 
 lineWidth = childWidth + hSpace;
 // 叠加当前高度,同理,加上下侧vSpace
 wrapHeight += lineHeight + vSpace;
 // 开启记录下一行的高度 
 lineHeight = childHeight; 
 } else {
 //记录每一个标签坐标,为onLayout做准备
 lParams.left = lineWidth;
 lParams.top = wrapHeight;
 lParams.right = lParams.left + childWidth;
 lParams.bottom = lParams.top + childHeight;
 //在本行追加标签,累加值到lineWidth,lineHeight取最大高度 
 lineWidth += childWidth + hSpace;
 lineHeight = Math.max(lineHeight, childHeight);
 } 
 // 如果是最后一个
 if (i == childCount - 1) {
 //将当前记录的最大宽度和当前lineWidth做比较,取较大值
 wrapWidth = Math.max(wrapWidth, lineWidth - hSpace);
 //布局高加上最后一行高
 wrapHeight += lineHeight; 
 } 
 } 
 setMeasuredDimension((modeWidth == MeasureSpec.EXACTLY) ? sizeWidth : wrapWidth, (modeHeight == MeasureSpec.EXACTLY) ? sizeHeight : wrapHeight); 
 }

使用FlowLayout

直接看xml吧,一看便知:



 

 

 

 

 

 

 

 

 
 

 

 

 

 

 

 

 

 

 
 

这里写的比较啰嗦,所有TextView都是写在xml里面的,当然我们也可以通过Java代码来动态添加。

再来看看style吧,这里我们定义了两种不同的风格,具体见下面:

 

 

找到background我们再进去看看,这里使用的是shapeDrawable,之后我会写一些关于shapeDrawable的文章:

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
  
  
  
  
 

 效果图如下:

源码下载:http://xiazai.jb51.net/201609/yuanma/Android-FlowLayout(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 一、在androidStudio中实现tabs比较简单,新建项目就可以选择tabs模板进行创建,默认实现tabs功能:直接运行项目就可以看到效果:可以说非常简单,但是我们在实际开发 ... [详细]
  • apk简单介绍APK的组成apk安装流程app的启动过程apk打包流程AIDLAIDL介绍为什么要设计这门语言它有哪些语法?默认支持的数据类型包括什么是apk打包流程 ... [详细]
  • Adapter相当于C(Controller,控制器),listView相当于V(View,视图)用于显示数据为ListView提供数据的List,数组或数据库相当于MVC模式中的 ... [详细]
  • Android开发之Notification(实现消息弹窗、提示音以及点击事件)
    文章目录通知管理器通知渠道通知发送通知更多效果添加点击事件取消消息通知管理器通知管理器(NotificationManager)类是一个通知管理器&# ... [详细]
  • 先看看效果是不是自己想要的吧item及item内部控件点击事件不懂的可以先点击查看 ... [详细]
  • docker整体了解
    Docker是一个基于LXC技术构建的容器引擎,基于Go语言开发,遵循Apache2.0协议开源Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移 ... [详细]
  • 成都万有算力(广州算力网络科技有限公司)
    在同期举办的第十三届天翼智能生态高峰论坛上,中国电信正式发布《中国电信AI+计划》。但从目前来看,后者的影响早已反过来远大于受置疑的前者。包括自由的金针菇、单纯的长颈鹿在内多位专家 ... [详细]
  • 1、对于List而言,要不然就使用迭代器,要不然就从后往前删除,从前往后删除会出现角标越界。因为我List有两个remove方法,一个是int作为形参(删除指定位置的元素),一个是 ... [详细]
  • SpringMVC启动流程——DispatcherServlet由于DispatcherServlet本身就是一个Servlet,它的本质上是一个Servlet,只是子类不断的对H ... [详细]
  • Today,IstartedtocreateacoupleofJSPpagesfortheserver-sidepartofmyMScthesisprojectinordertob ... [详细]
  • “新建安卓工程时,src与res目录下没有自动生成的.java和.xml文件“的解决
    在自学编程的过程中,由于没有老司机带路,环境搭建是一个非常容易出小错误而且很难找错的过程。此次JAVA环境搭建好,并进行JAVA基础的学习之后,搭建安卓环境。我默认下了目前较高版本 ... [详细]
  • 人生的旅途,前途很远,也很暗。然而不要怕,不怕的人的面前才有路。——鲁迅自从上一篇博客发布后,已经有很长时间没有更新博客了,一直忙着支付通的事情,在此给大家道个歉。先贴个图:你不要惊讶 ... [详细]
  • 稀松数组
    稀松数组1.稀松数组什么?在一个数组中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该数组为稀疏数组;如图,一个5*5的数组arr上只有3个有效数值 ... [详细]
  • 问题说明最近看到Spring事务,在学习过程中遇到一个很苦恼问题搭建好Spring的启动环境后出现了一点小问题在启动时候却出现[java.lang.NullPointerExcep ... [详细]
  • pdf怎么把html变成pdf1 用AdobeAcroat8.1.2,打开网页后,页面右键菜单中会出现一个“转换为AobePDF的选项,点击就可以转换。 安装AdobeAcroba ... [详细]
author-avatar
ZYL-120501
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有