前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自定义View之Measure(二)

自定义View之Measure(二)

作者头像
小柔
发布2022-10-09 11:26:40
2550
发布2022-10-09 11:26:40
举报
文章被收录于专栏:小柔博客园

theme: fancy

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方法
代码语言:javascript
复制
public void setMinimumWidth(int minWidth){
    //保存
    mMinWidth=minWidth;
    //重新布局该View
    requestLayout();
}
getMiniumWidth方法
代码语言:javascript
复制
public int getMiniumWidth(){
    //获取该属性得到的的是这个Drawable的固有宽度
    final int intrinsicWidth=getIntrinsicWidth();
    return intrinsicWidth>0?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的宽度减去padding,mode为精确模式

3.子元素的MeasureSpec属性也为AT_MOST,它的SpecSize值为父容器的SpecSize减去padding的值这和子元素设置LayoutParams属性为MATCH_PARENT效果是一样的,但是其Mode是ATMOST。为了解决这个问题,需要在LayoutParams属性为WRAP_CONTENT时指定一下默认的宽和高

ViewGroup并没有提供onMeasure 方法,而是让其子类来各自实现测量的方法,究其原因就是ViewGroup有不同布局的需要,很难统一

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • theme: fancy
    • setMinimumWidth方法
      • getMiniumWidth方法
        • 对应于ViewGroup
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档