关于定义布局OnMeasure 的总结

本文探讨了在Android中,OnMeasure方法在定义布局过程中的关键作用。measure函数旨在为整个View树计算尺寸,设置每个View的布局大小。在ViewGroup的非抽象子类中,必须重写onMeasure方法来衡量其子View。measure过程涉及三个核心函数,包括measure、setMeasuredDimension和onMeasure。当有子View时,先测量子View,然后测量自身。在自定义控件时,经常需要重写OnMeasure以限制和记录控件的尺寸。
摘要由CSDN通过智能技术生成
                                                                                       measure 过程分析

因为DecorView实际上是派生自FrameLayout的类,也即一个ViewGroup实例,该ViewGroup内部的ContentViews又是一个ViewGroup实例,依次内嵌ViewViewGroup形成一个View树。所以measure函数的作用是为整个View树计算实际的大小,设置每个View对象的布局大小(“窗口”大小)。实际对应属性就是View中的mMeasuredHeight(高)和mMeasureWidth(宽)。

View类中measure过程主要涉及三个函数,函数原型分别为

public final void measure(int widthMeasureSpec, int heightMeasureSpec)

protected final void setMeasuredDimension(int measuredWidth, int measuredHeight)

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

前面两个函数都是final类型的,不能重载,为此在ViewGroup派生的非抽象类中我们必须重载onMeasure函数,实现measure的原理是:假如View还有子View,则measureView,直到所有的子View完成measure操作之后,再measure自己。ViewGroup中提供的measureChildmeasureChildWithMargins就是实现这个功能的。 自定义控件的时候经常会重写OnMeasure方法,测量之类,给容器限制大小范围,记录下设置的宽高大小 。接下来 先看下源码




 1.     首先 覆写OnMeasure 方法,当你的类是继承ViewGrounp的时候,必要的时候要要测量下子View ,继承View 如果包含你自定义View是线性布局就测量一次,
如果父布局是相对布局就要测量两次 执行两次OnMeasure 

   

















 2. 接下来调用 SetMeasuredDimension设置测量最后的宽高大小
































3.设置宽高的参数 里面的getDefaultSize方法的参数值,第一个是有背景图片时的宽高,第二个是父类传进来子View需要多大的大小


































4.如果测量子View的时候调用 measureChildren会遍历自己的所以子View,然后View.measure,最后调用View类里的Measure方法,接着跳到OnMeasure方法。























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值