当前位置: 首页 > news >正文

自定义View之Measure(二)

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){//保存mMinWidth=minWidth;//重新布局该ViewrequestLayout();
}
getMiniumWidth方法
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有不同布局的需要,很难统一

原文:自定义View之Measure(二) - 掘金 (juejin.cn)

http://www.lryc.cn/news/232868.html

相关文章:

  • SQL注入学习--GTFHub(布尔盲注+时间盲注+MySQL结构)
  • Kubernetes学习-概念2
  • StyleGAN:彻底改变生成对抗网络的艺术
  • 黑马程序员微服务第四天课程 分布式搜索引擎1
  • 向量以及矩阵
  • 9.程序的机器级代码表示,CISC和RISC
  • 《硅基物语.AI写作高手:从零开始用ChatGPT学会写作》《从零开始读懂相对论》
  • 【2016年数据结构真题】
  • 创作者等级终于升到4级了
  • Games104现代游戏引擎笔记 面向数据编程与任务系统
  • 系列三、GC垃圾回收【总体概览】
  • 无线WiFi安全渗透与攻防(N.3)WPA破解-创建Hash-table加速并用Cowpatty破解
  • golang 动态库
  • Python的2042小游戏及其详解
  • 怎么去掉邮件内容中的回车符
  • Git-概念与架构
  • android 数独小游戏 经典数独·休闲益智
  • GAT里面的sofamax函数的实现:
  • Idea 编译SpringBoot项目Kotlin报错/Idea重新编译
  • 【Qt之QWizard问题】setPixmap()设置logo、background、watermark无效不显示解决方案
  • mysql 设置远程登录
  • ES的索引概念
  • text/xml和application/xml
  • 鸿蒙4.0正式版升级机型
  • 架构开发与优化咨询和实施服务
  • react hook ts 实现 列表的滚动分页加载,多参数混合混合搜索
  • Java应用如何不改代码,调整窗口大小
  • 汽车 CAN\CANFD数据记录仪
  • Kafka中topic(主题)、broker(代理)、partition(分区)和replication(副本)它们的关系
  • Mysql字符串类型编码问题