导 致 V iew 树重新遍历的总体诱因
下面介绍各种能引起View树重新遍历的操作,这些操作总的来讲可以分为三类。一类是导致视图
大小发生变化;第 二 类是导致ViewGroup重新为子视图分配位置;第三类是视图显示情况发生变化需
要 重 绘 。这 三 类 情 况 最 后 都 直 接 或 间 接 调 用 到 三 个 函 数 ,分 别 为 invalidateO、 requestLayoutO及
requestFocus(),而这三个函数最终都会调用到ViewRoot中 的schueduleTraversals()函数,该函数然后发
起一个异步消息,消息处理中调用performTraversals()开始对整个View进行重新遍历,如 图 13-10所不。
能导致调用invalidate()函数的包含三种情况:当应用程序改变视图显示属性时,调 用 setVisibility();
当改变视图Selected状态时,调 用 setSelected();当改变视图Enable状态时,调 用 setEnable()函数。
导 致 调 用 requestLayoutO函 数 的 情 况 包 含 两 种 : 当 应 用 程 序 改 变 视 图 显 示 属 性 时 , 调用
setVisibility(),由于显示或者不显示将影响其他兄弟视图的位置,因此会调用到requestLayout();第二
种是应用程序直接或间接调用该函数,间接调用是指应用程序调用了 View类的其他函数,从而间接调
用到 requestLayou()。
requestFocusO—般由程序直接调用,间接调用是指当用户按“上/下”、 “左/右” 键时,相关的处理
逻辑会间接调用到该函数。