洛阳建设工程信息网站,四位一体网站开发,深圳品牌网站建设公司排名,类似微薄利网站怎么做measure 用来测量 View 的宽和高#xff0c;它的流程分为 View 的 measure 流程和 ViewGroup 的measure流程#xff0c;只不过ViewGroup的measure流程除了要完成自己的测量#xff0c;还要遍历地调用子元素的measure#xff08;#xff09;方法。 上一回说到performMeasur… measure 用来测量 View 的宽和高它的流程分为 View 的 measure 流程和 ViewGroup 的measure流程只不过ViewGroup的measure流程除了要完成自己的测量还要遍历地调用子元素的measure方法。 上一回说到performMeasure方法前会得到DecoreView的MeasureSpec接着调用DecoreView的measure方法携带宽高这两个MeasureSpec做处理。 View的onMeasure前会计算好View的MeasureSpec接着调用onMeasure传递进去ViewGroup中也是如此遍历子View得到子View的MeasureSpec接着在调用onMeasure。
那么接下来是干什么得到View自身的MeasureSpec就可以直接赋值了吗》
首先判断是否有无背景无背景情况使用view最小宽度对应于View的mMinWidth属性有背景情况下使用背景drawable的intrinsicwidth固有宽度(mBackground.getMiniumWidth)
setMinimumWidth方法
public void setMinimumWidth(int minWidth){//保存mMinWidthminWidth;//重新布局该ViewrequestLayout();
}getMiniumWidth方法
public int getMiniumWidth(){//获取该属性得到的的是这个Drawable的固有宽度final int intrinsicWidthgetIntrinsicWidth();return intrinsicWidth0?intrinsicWidth:0
} 拿到最小宽高后结合MeasureSpec的Mode做处理 如果SpecMode是UNSPECIFIED那么就返回这个最小值如果是ATMOST或者EXACTLY返回MeasureSpec中自带的宽高也就是当前View的SpecSize 这下 宽高就知道了但是这个宽高是原始的宽高 这里需要针对padding和margin进行在处理View的宽高最终的宽高其实就是View真实的宽高。
对应于ViewGroup
其拿到自身的MeasureSpec后需要进行生成子View的MeasureSpec循环遍历可见的子view并调用measurechildren方法测量每个子view 该方法传入需要测量的子view实例还有自身的measurespec因为测量子View的真实宽高是通过父view的measurespec和自己的宽高结合处理的
父view的specmode为atmost时
1.子view给出来了具体的宽度 传给子view的宽度就是具体的宽高spec采用精确模式
2.子viewmatch 宽度为父view的宽度减去paddingmode为精确模式
3.子元素的MeasureSpec属性也为AT_MOST它的SpecSize值为父容器的SpecSize减去padding的值这和子元素设置LayoutParams属性为MATCH_PARENT效果是一样的但是其Mode是ATMOST。为了解决这个问题需要在LayoutParams属性为WRAP_CONTENT时指定一下默认的宽和高。 ViewGroup并没有提供onMeasure 方法而是让其子类来各自实现测量的方法究其原因就是ViewGroup有不同布局的需要很难统一 原文自定义View之Measure二 - 掘金 (juejin.cn)