Android中invalidate() 函数详解(结合Android 4.0.4 最新源码)
invalidate()函数的主要作用是请求View树进行重绘,该函数可以由应用程序调用,或者由系统函数间接调用,例如setEnable(), setSelected(), setVisiblity()都会间接调用到invalidate()来请求View树重绘,更新View树的显示。
注:requestLayout()和requestFocus()函数也会引起视图重绘
下面我们通过源码来了解invalidate()函数的工作原理,首先我们来看View类中invalidate()的实现过程:
具体分析如下:
1、判断此次调用是否在UI线程中进行2、将dirty的坐标位置转换为ViewRoot的屏幕显示区域
3、更新mDirty变量,并调用scheduleTraversals发起重绘请求
至此一次invalidate()就结束了
总结:invalidate主要给需要重绘的视图添加DIRTY标记,并通过和父视图的矩形运算求得真正需要绘制的区域,并保存在ViewRoot中的mDirty变量中,最后调用scheduleTraversals发起重绘请求,scheduleTraversals会发送一个异步消息,最终调用performTraversals()执行重绘,performTraversals()的具体过程以后再分析。
以上所有代码基于Android 4.0.4,并结合《Android内核剖析》分析总结而成,源码中涉及到的部分细节本人也未完全理解,还望高手指点~~