• 自定义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方法
    1. public void setMinimumWidth(int minWidth){
    2. //保存
    3. mMinWidth=minWidth;
    4. //重新布局该View
    5. requestLayout();
    6. }
    getMiniumWidth方法
    1. public int getMiniumWidth(){
    2. //获取该属性得到的的是这个Drawable的固有宽度
    3. final int intrinsicWidth=getIntrinsicWidth();
    4. return intrinsicWidth>0?intrinsicWidth:0
    5. }

    拿到最小宽高后结合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)

  • 相关阅读:
    维格云门户入门教程
    软考 系统架构设计师系列知识点之边缘计算(2)
    猿创征文c++学习之路的工具
    ArmSom---SPI开发指南
    Hbase相关总结
    算力经济下DPU芯片的发展机遇
    临床评分SOFA、SIRS、qSOFA、LODS、OASIS、SAPS、SAPS II
    ORACLE-递归查询、树操作
    游戏开发这么久没见过github-lfs-居然不能下载图片的,这就让你见到了解决方法
    申请专利这10个知识点一定要知道哦
  • 原文地址:https://blog.csdn.net/m0_65909361/article/details/134452508