android流式布局onLayout()方法详解
发布时间 - 2026-01-11 01:46:12 点击率:次在上一篇中及就写了自定义view中的onMeausre()和onDraw()两个方法。在这里就用简单的流式布局来介绍一下onLayout()方法。

在onLayout方法中有四个参数,我画了一个简单的图来分清楚值哪里。
好啦,现在就直接看代码吧。
FlowLayout.Java
package com.example.my_view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
/**
* 自定义布局 流布局
*/
public class FlowLayout extends ViewGroup {
public FlowLayout(Context context) {
super(context);
}
public FlowLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
*
* @param changed
* @param l 左
* @param t 上
* @param r 右
* @param b 下
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
//获得子控件的数量
int childCount = getChildCount();
//当前子控件的左边坐标
int cl = 0;
//当前子控件的上边坐标
int ct = 0;
//ViewGroup整体宽度
int width = r - l;
//行高
int lineHeight = 0;
//遍历所有子控件
for(int i = 0; i < childCount; i++){
//获取当前控件
View childAt = getChildAt(i);
//获取宽度
int cw = childAt.getMeasuredWidth();
//获取高度
int ch = childAt.getMeasuredHeight();
//当前控件右边
int cr = cl + cw;
//当前控件下边
int cb = ct + ch;
//判断是否换行
if(cr > width){
//如果换行重新计算上下左右地值
cl = 0;
cr = cl + cw;
ct += lineHeight;
cb = ct + ch;
//换行后,第一个控件作为最大行高
lineHeight = ch;
}else{
//如果不换行,需要计算最大高度
lineHeight = Math.max(lineHeight,ch);
}
childAt.layout(cl,ct,cr,cb);
//横向向后移动一个,前面控件的右边作为后面控件的左边
cl = cr;
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//测量所有子控件
measureChildren(widthMeasureSpec, heightMeasureSpec);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.example.my_view.FlowLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.my_view.MainActivity">
<!--
<com.example.my_view.Counter
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:number="10"
app:bgColor="#ff002b"
app:textColor="#0fd444"/>-->
<!--<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我在自定义布局的下面"/>-->
<Button
android:layout_width="200dp"
android:layout_height="50dp"
android:text="button1"/>
<Button
android:layout_width="100dp"
android:layout_height="100dp"
android:text="button2"/>
<Button
android:layout_width="180dp"
android:layout_height="60dp"
android:text="button3"/>
<Button
android:layout_width="100dp"
android:layout_height="50dp"
android:text="button4"/>
<Button
android:layout_width="80dp"
android:layout_height="100dp"
android:text="button5"/>
<Button
android:layout_width="100dp"
android:layout_height="50dp"
android:text="button6"/>
<Button
android:layout_width="120dp"
android:layout_height="70dp"
android:text="button7"/>
<Button
android:layout_width="100dp"
android:layout_height="50dp"
android:text="button8"/>
</com.example.my_view.FlowLayout>
效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android
# 流式布局
# onLayout
# Android流式布局FlowLayout详解
# Android流式布局实现历史搜索记录功能
# Android实现热门标签的流式布局
# Java Swing组件布局管理器之FlowLayout(流式布局)入门教程
# Android简单实现自定义流式布局的方法
# Android自定义ViewGroup之实现FlowLayout流式布局
# Android 简单实现一个流式布局的示例
# Android自定义流式布局/自动换行布局实例
# python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
# Flexbox+ReclyclerView实现流式布局
# 自定义
# 换行
# 在这里
# 我在
# 第一个
# 遍历
# 中有
# 上下左右
# 写了
# 就用
# 在上
# 介绍一下
# 好啦
# 画了
# 大家多多
# 大行
# 判断是否
# 流式
# public
# super
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
,在苏州找工作,上哪个网站比较好?
如何解决hover在ie6中的兼容性问题
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
JavaScript中的标签模板是什么_它如何扩展字符串功能
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何基于PHP生成高效IDC网络公司建站源码?
如何在IIS中新建站点并配置端口与IP地址?
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
详解Oracle修改字段类型方法总结
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何在七牛云存储上搭建网站并设置自定义域名?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
JavaScript如何实现类型判断_typeof和instanceof有什么区别
如何在局域网内绑定自建网站域名?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
如何登录建站主机?访问步骤全解析
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
如何在云服务器上快速搭建个人网站?
jQuery 常见小例汇总
IOS倒计时设置UIButton标题title的抖动问题
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
SQL查询语句优化的实用方法总结
C++用Dijkstra(迪杰斯特拉)算法求最短路径
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
详解vue.js组件化开发实践
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
米侠浏览器网页背景异常怎么办 米侠显示修复
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
浅谈javascript alert和confirm的美化
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
如何在IIS中配置站点IP、端口及主机头?
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Linux系统命令中tree命令详解
潮流网站制作头像软件下载,适合母子的网名有哪些?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧

