当前位置: 首页 > news >正文

View的layout机制

View框架的工作流程为:测量每个View大小(measure)-->把每个View放置到相应的位置(layout)-->绘制每个View(draw)。

源代码分析

   在View的源代码中,提取到了下面一些关于layout过程的信息。

   我们知道,整棵View树的根节点是DecorView,它是一个FrameLayout,所以它是一个ViewGroup,所以整棵View树的测量是从一个ViewGroup对象的layout方法开始的。

View:

1、layout

//分配一个位置信息到一个View上面,每个parent会调用children的layout方法来设置children的位置。最好不要覆写该方法,有children的viewGroup,应该覆写onLayout方法

public void layout(int l, int t, int r, int b) ;

2、onLayout

/** 根据布局规则,计算每一个子View的位置,View类默认是空实现。 所以这里没有源代码*/
protected void onLayout(boolean changed, int left, int top, int right, int bottom);

 

ViewGroup:

ViewGroup中,只需要覆写onLayout方法,来计算出每一个子View的位置,并且把layout流程传递给子View。源代码:
ViewGroup没有实现,具体可以参考LinearLayout和RelativeLayout的onLayout方法。虽然各个具体实现都很复杂,但是基本流程是一样的,可以参考下面的伪代码。

protected void onLayout(boolean changed, int l, int t, int r, int b) {  
    for (遍历子View) {  
        /** 
        根据如下数据计算。 
            1、自己当前布局规则。比如垂直排放或者水平排放。 
            2、子View的测量尺寸。 
            3、子View在所有子View中的位置。比如位置索引,第一个或者第二个等。 
        */  
        计算每一个子View的位置信息;   
          
        child.layout(上面计算出来的位置信息);  
    }         
}  


结论

        一般来说,自定义View,如果该View不包含子View,类似于TextView这种的,是不需要覆写onLayout方法的。而含有子View的,比如LinearLayout这种,就需要根据自己的布局规则,来计算每一个子View的位置。

 

相关文章:

  • 免费 cdn
  • 利用js和JQuery定义一个导航条菜单
  • storm1.0节点间消息传递过久分析及调优
  • java api 调用es集群(1.7版本)
  • SQL Server 中WITH (NOLOCK)浅析
  • shiro权限认证与授权
  • 时间处理的一些代码片段
  • 自动化-----saltstack基础技术
  • 排序算法(java版)
  • 初学ArcGIS API for JavaScript
  • 倒排列表求交集算法汇总
  • BZOJ 4195: [Noi2015]程序自动分析 [并查集 离散化 | 种类并查集WA]
  • UIButton的titleLabel不同状态字体判断
  • STM32 Flash Download failed
  • H5+css从入门到精通
  • 5、React组件事件详解
  • HTML-表单
  • js学习笔记
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • MYSQL 的 IF 函数
  • PermissionScope Swift4 兼容问题
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 给初学者:JavaScript 中数组操作注意点
  • 今年的LC3大会没了?
  • 力扣(LeetCode)965
  • 微信开放平台全网发布【失败】的几点排查方法
  • 学习ES6 变量的解构赋值
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #HarmonyOS:Web组件的使用
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (ibm)Java 语言的 XPath API
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (十一)c52学习之旅-动态数码管
  • (译)2019年前端性能优化清单 — 下篇
  • (转)EOS中账户、钱包和密钥的关系
  • (转)ObjectiveC 深浅拷贝学习
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • /var/log/cvslog 太大
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @RequestBody的使用
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——