自定义view布局过程详解
2024-08-31 20:31:03
布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。
布局分为两个阶段:测量阶段和布局阶段。
测量阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 measure() 方法,测量他们的尺寸并计算它们的位置;
布局阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 layout() 方法,把测得的它们的尺寸和位置赋值给它们;
View或ViewGroup的布局过程
测量阶段,
measure()
方法被父 View 调用,在measure()
中做一些准备和优化工作后,调用onMeasure()
来进行实际的自我测量。onMeasure()
做的事,View
和ViewGroup
不一样:- View:
View
在onMeasure()
中会计算出自己的尺寸然后保存,保存使用setMeasuredDimension()方法; - ViewGroup:
ViewGroup
在onMeasure()
中会调用所有子 View 的measure()
让它们进行自我测量,并根据子 View 计算出的期望尺寸来计算出它们的实际尺寸和位置然后保存。同时,它也会根据子 View 的尺寸和位置来计算出自己的尺寸然后保存;
- View:
布局阶段,
layout()
方法被父 View 调用,在layout()
中它会保存父 View 传进来的自己的位置和尺寸,并且调用onLayout()
来进行实际的内部布局。onLayout()
做的事,View
和ViewGroup
也不一样:- View:由于没有子 View,所以
View
的onLayout()
什么也不做。 - ViewGroup:
ViewGroup
在onLayout()
中会调用自己的所有子 View 的layout()
方法,把它们的尺寸和位置传给它们,让它们完成自我的内部布局。
- View:由于没有子 View,所以
重写 onMeasure()
来修改已有的 View
的尺寸具体做法:
- 重写
onMeasure()
方法,并在里面调用super.onMeasure()
,触发原有的自我测量; - 在
super.onMeasure()
的下面用getMeasuredWidth()
和getMeasuredHeight()
来获取到之前的测量结果,并使用自己的算法,根据测量结果计算出新的结果; - 调用
setMeasuredDimension()
来保存新的结果。
父View的尺寸限制:
- 开发者的要求(布局文件中
layout_
打头的属性)经过父 View 处理计算后的更精确的要求; - 限制的分类:
UNSPECIFIED
:不限制AT_MOST
:限制上限EXACTLY
:限制固定值
重新自定义尺寸的方式:
- 重新
onMeasure()
,并计算出 View 的尺寸; - 使用
resolveSize()
来让子 View 的计算结果符合父 View 的限制(当然,如果你想用自己的方式来满足父 View 的限制也行)。
最新文章
- 引用项目外dll时不显示注释的解决方案
- 前端开发教程:使用 CSS3 Transforms 构建圆形导航
- Linux 内核高-低端内存设置代码跟踪(ARM构架)
- ORACLE查看并修改session和连接最大数
- XSS攻击:获取浏览器记住的明文密码
- Android之Activity框架
- 系统学习sqlserver2012 一
- javascript实现map的功能(转载)
- Mac OS X Yosemite 10.10 配置 Apache+PHP 教程注意事项
- js 中特殊形势的函数-匿名函数的应用
- vuejs 三级联动
- OCP-1Z0-053-V12.02-512题 【转】
- 降低成本是永恒的追求(xamarin)
- .net Ajax与后台一般处理程序(ashx) 交互
- Oracle误删数据文件后出现oracle initialization or shutdown in progress解决
- Selenium_Java版本安装及初试
- 好用的Markdown编辑器汇总
- 【Storm】Storm实战之频繁二项集挖掘(附源码)
- JDK源码分析(2)LinkedList
- python-day47--pymysql模块
热门文章
- 理解String的compareTo()方法返回值
- 关于在IISserver上执行asp.net Web程序出现以下 “Could not load file or assembly。。。”问题的
- 重新启动IIS不重启电脑
- LeetCode Algorithm 05_Longest Palindromic Substring
- python3 turtle画正方形、矩形、正方体、五角星、奥运五环
- [AngularJS] Interpolation fail in IE 11
- apache-spark导入eclipse环境
- 对照jQuery和AngularJS的不同思维模
- [spark]Spark Streaming教程
- HTTP请求头与响应头