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

自定义View之MeasureSpec(一)

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

theme: fancy

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

在前面一篇文章中介绍了View绘制流程和Sync信号的关系

回顾:1.按顺序发送INPUT,ANIMATION,TRASVEL并处理他们各自的doFrame方法 先处理输入事件在处理动画,最后的TRASVEL会进行调用到ViewRootImpl中的doTrasvel回调,这个回调里面会进行measure,layout和draw。

在起始的测量measure阶段我们需要获取到View的真实宽高,这个需要借助于父View的测量模式和当前View的宽高一起来决定最终View的宽高;ViewGroup也是一样的需要去循环获取子View的宽高最后决定自己的宽高,测量模式和宽高会被封装到一个叫MeasureSpec的类中。

MeasureSpec是View的内部类,其封装了一个View的规格尺寸,包括View的宽和高的信息,他的作用是在Measure流程中,系统会将View的LayoutParams根据父容器所施加的规则转换成对应的MeasureSpe,然后在onMeasure中根据这个MeasureSpec来确定View的宽和高

MeasureSpec代表了32位的int值,高两位代表SpecMode,低30位表示SpecSize。

MeasureSpec的模式SpecMode

UNSPECIFIED:未定义模式,父容器不做限制

AT_MOST:最大模式,对应于wrap_content,子View的大小是父View的SpecSize

EXACTLY:精确模式,对应match_content和具体给出的宽高数值

每一个View都有一个MeasureSpec,在测量过程中可以通过makeMeasureSpec保存View的宽高,getMode和getSize的到宽高和测量模式。

DecoreView的MeasureSpec

前面一篇文章中说到顶层的View其实是DecoreView,他也属于一个View,那么他的MeasureSpec又是怎样的呢?

在ViewRootImpl中调用的performTraveals方法(参照开头给出的文章链接)中,会获取根View代表宽的MeasureSpec还有高的MeasureSpec:

可以看到DecoreView的宽高其实就是Window的宽高,而rootDimension是DecoreView自身的LayoutParams,由此可见:DecoreView的宽高是按照Window的宽高和本身的LayoutParams决定

接着将DecoreView获取到的MeasureSpec传递到齐子View中,进行不断的遍历和重复该过程,直到Measure完成后进入到layout中。

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

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

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

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

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