Android自定义View--onLayout

本文详细解析Android中View的onLayout方法,包括View的树形结构、位置相关的方法、Layout过程和onLayout的实现。重点讨论如何在自定义ViewGroup时正确设置子View的位置,通过示例阐述计算View位置的逻辑,以及getWidth/Height与getMeasuredWidth/Height的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在谈如何使用onLayout方法前,先简单回忆一下知识点:

View视图结构:

View视图可以是单一的一个如TextView,也可以是一个视图组(ViewGroup)如LinearLayout。

如图:对于多View的视图他的结构是树形结构,最顶层是ViewGroup,ViewGroup下可能有多个ViewGroup或View。

这个树的概念很重要,因为无论我们是在测量大小或是调整布局的时候都是从树的顶端开始一层一层,一个分支一个分支的进行(树形递归)。

 

View 和位置相关的常用方法:

开发过程中,我们常用到一些诸如 getTop 的方法,这一小节简单地介绍这些方法,说明他们真正的含义。这里需要补充说明的是,这些方法设计到的单位都是 Pixel,不是 dip 哦。

方法名 含义
getTop view左上角与父view之间的距离
getBottom 子View右下角距父View顶部的距离
getLeft 子View左上角距父View左侧的距离
getRight 子View右下角距父View左侧的距离

下面的图例也说明了这一点。

 

Layout(源码分析):

Layout的作用就是为整个View树计算实际的位置,而通过刚才对View树的介绍知道,想计算整个View树的位置,就需要递归的去计算每一个子视图的位置(Measure同理)。

而确定这个位置很简单,只需要mLeft,mTop,mRight,mBottom四个值(注意:这4个值是子View相对于父View的值,下面会详细介绍)。

在代码中如何设置这4个值呢?

首先,无论是系统提供的LinearLayout还是我们自定义的View视图,他都需要继承自ViewGroup类,之后必须要做的就是重写onLayout方法(因为在onLayout在ViewGroup中被定义为抽象方法)。

ViewGroup-onlayout:

    /**
     * 当这个view和其子view被分配一个大小和位置时,被layout调用。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值