• viewgroup绘制流程


    view 与 ViewGroup绘制流程基本相同,在ViewGroup中不仅要绘制自己,还需绘制其中的子控件,而view只需绘制自己。

    view绘制流程:测量,布局,绘制

    1. onMeasure() : 测量当前控件的大小,为正式布局提供建议   (仅是建议,用不用要看onLayout() 函数)
    2. onLayout() : 使用Layout()函数为所有子控件进行布局
    3. onDraw():根据布局的位置绘图

    onMeasure(int widthMeasureSpec , int heightMeasureSpec):

    MeasureSpec  前2位代表模式,后30位代表数值(size)

    模式分类:

    1. 00   USPECIFIED(未指定):父元素不对子元素施加任何束缚,子元素可以得到任意想要大小
    2. 01    EXACTLY(完全):父元素决定了子元素确切的大小,子元素将被限定在给定的边界里 而忽略自身大小
    3. 10    AT_MOST(至多):子元素最多达到指定大小的值

    onLayout(boolean changed, int l, int t, int r, int b)

    onLayout() 是实现所有子控件布局的函数        那么,关于自己的layout呢?    它自己是由自己的父控件完成的 ,,,在layout中使用setFrame设置自己的位置, 设置完再调onLayout来设置自己的子控件

    onLayout()中使用child.layout(0, top, chidWidth, top+ chidHeight) 来确定子控件的位置

    getWidth() 和 getMeasureWidth() 的区别:

    1. getMeasureWidth()在Measure过程结束就可以得到 宽度值 ,,      getWidth() 要在layout()结束之后才可以得到
    2. getMeasureWidth() 通过 setMeasureDimension() 函数进行设置,,      getWidth() 通过 layout(left, top, right, bottom) 来设置
    3. getWidth 和 getMeasureWidth  一般是一样,但是,当layout方法传入的值与getMeasureWidth不同时,getWidth 和 getMeasureWidth 的返回值就不一样了           getWidth拿的是layout的,getMeasureWidth是Measure的

    获取子控件margin值的方法

    如果想要自定义的ViewGroup可以支持layout_margin参数,则自定义的ViewGroup类必须重写generateLayoutParams() &&  generateDefaultLayoutParams函数,并在该函数返回一个ViewGroup.MarginLayoutParams派生类对象。

    为什么要重写generateLayoutParams()?????

    因为默认的generateLayoutParams() 只会提取layout_width 和 layout_height 的值,  只有MarginLayoutParams()函数才具有提取margin值的能力。因此重写generateLayoutParams() 来返回 MarginLayoutParams() 获取margin值。

  • 相关阅读:
    java8 lambda表达式的使用
    关键字 static 静态
    关键字 enum 枚举
    关键字:final 最终的不可被改变的
    关键字 abstract 抽象
    Java中的关键字汇总(50个)
    关键字 assert 断言
    关键字 instanceof 实例
    java8新特性
    docker update restart=always container
  • 原文地址:https://www.cnblogs.com/acg88688/p/11870590.html
Copyright © 2020-2023  润新知