• 自定义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)

  • 相关阅读:
    【计算机毕业设计】网上商城购物系统
    Springboot全局异常和自定义异常
    docker常用操作命令
    vue2中,vue-easytable组件的使用(三)——实现表格的虚拟滚动功能
    程序员迷茫:30岁以上的“大龄程码农”出路在哪?java码农该怎么办?
    BOND ~
    C. Diverse Matrix
    如何把项目上传到Gitee(详细教程)
    IOT物联网系统架构
    Camera1 源码解析系列(三)—— Camera1 hw_get_module() 解析
  • 原文地址:https://blog.csdn.net/m0_65909361/article/details/134452508