zoukankan      html  css  js  c++  java
  • 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值。

  • 相关阅读:
    转 Python常见数据结构整理
    转 Python爬虫实战二之爬取百度贴吧帖子
    转 Python——UnicodeEncodeError: 'ascii' codec can't encode/decode characters
    慕课 python 操作数据库2 银行转账实例
    转 Python爬虫实战一之爬取糗事百科段子
    SQL 锁 lock
    SQL SERVER CROSS/OUTER APPLY 用法
    sql server 怎样用select语句调用自定义表值函数
    计算日期类型
    行转列:SQL SERVER PIVOT与用法解释
  • 原文地址:https://www.cnblogs.com/acg88688/p/11870590.html
Copyright © 2011-2022 走看看