zoukankan      html  css  js  c++  java
  • Android是如何绘制View的

     当一个activity获得焦点时, 它会被要求绘制它的布局. Android框架将处理绘制的过程, 但是activity必须提供它的布局体系的根节点. 绘制将从根节点开始, 根节点被要求测量和绘制布局树. 绘制是通过遍历树并渲染每个处于有效区域内的view来完成的. 每个view group依次负责要求它的每个子元素绘制自身,而每个view负责绘制它自己. 由于树使用中序遍历(in-order traverse), 这意味着父元素首先被绘制, 然后是子元素按照它们出现的顺序来绘制. (译者注: 这里in-order疑为pre-order)

    绘制布局是一个两次的过程: 一个测量过程和一个布局过程. 测量过程实现在measure(int,int)中, 是对View树的一个自顶向下的遍历. 每个View将尺寸要求向下一层传递. 在测量过程的最后, 每个view储存了它的测量值. 第二个过程在layour(int,int,int,int)中发生, 同样从上到下. 在这一个过程中每个父元素负责根据在测量过程中计算的大小, 将子元素放在合适的位置.

    当一个View的measure()方法返回时, 它和它的后代元素的getMeasuredWidth()和getMeasuredHeight()值必须被设定. 一个view的测量宽度和测量高度必须遵循它的父View的限制. 这将保证在测量过程之后, 所有的父元素接受它们的子元素的测量值. 一个父View可能对它的子元素不止调用一次measure(). 例如, 父元素可能不带参数的测量每个子元素一次来得到它们希望的大小, 然后再次调用带参数的measure()如果子元素的大小超过限制. (即, 如果子元素相互无法协调, 父元素将为它们设置规则.)

    测量过程使用两个类来传递尺寸. View使用View.MeasureSpec来告诉它们的父元素它们希望如何被测量和放置. LayoutParams类描述了一个View希望它的长和宽各为多少. 它可以指定下列的一个:

    • 一个确定的数值
    • 表示View希望和它的父元素一样大(除去padding)
    • 表示View希望能足够包括它的内容(加上padding)

    LayoutParams 的不同子类可用于不同的ViewGroup子类. 例如RelativeLayout 有它自己的LayoutParams子类, 该子类包括了让每个子View水平和竖直居中的功能.

    MeasureSpecs 可用来将要求向下传递. 一个MeasureSpec 可以为三种模式中的一种:

    • UNSPECIFIED: 一个父元素用它来决定子View的期望大小. 例如, 一个 LinearLayout 可能需要对它的子元素调用measure(), 将高度设为UNSPECIFIED ,宽度设为 EXACTLY 240来得到子View在宽度为240像素时,它的期望高度是多少.
    • EXACTLY: 一个父元素用它来为子元素强加一个精确的大小. 子元素必须使用这个大小, 并保证它的所有后代元素遵守这个限制.
    • AT_MOST: 父元素用它来为子元素强加一个最大尺寸. 子元素必须保证它和它所有的后代在这个大小之内

    原文链接:http://blog.csdn.net/liao3841054/article/details/6980546
  • 相关阅读:
    「WordPress 技巧」:如何修改 WordPress 数据库前缀
    wordpress安全防护,你了解多少
    一些需要禁用的PHP危险函数(disable_functions)
    可以安全禁用的PHP函数之disable_functions功能详解
    不定高度的元素实现transition动画_如何为height:auto的div添加css3过渡动画
    完美兼容实现:解决textarea输入框限制字数长度(带统计功能)
    使用Map标签指定点击区域时的兼容性问题
    前端性能测试工具整理简介_性能测试工具都有哪些?
    移动端开发注意问题
    HTML51-清除浮动overflow、网易注册界面基本结构搭建
  • 原文地址:https://www.cnblogs.com/xgjblog/p/4837645.html
Copyright © 2011-2022 走看看