强调一点的就是,在onMeasure(),onLayout(),onDraw()这三个流程中,Google已经帮咱们把draw()过程框架已经写好了,自定义的ViewGroup只须要实现
measure()过程和layout()过程便可 。框架
这三种状况,最终会直接或间接调用到三个函数,分别为invalidate(),requsetLaytout()以及requestFocus() ,接着
这三个函数最终会调用到ViewRoot中的schedulTraversale()方法,该函数而后发起一个异步消息,消息处理中调用
performTraverser()方法对整个View进行遍历。异步
invalidate()方法 :函数
说明:请求重绘View树,即draw()过程,假如视图发生大小没有变化就不会调用layout()过程,而且只绘制那些“须要重绘的”
视图,即谁(View的话,只绘制该View ;ViewGroup,则绘制整个ViewGroup)请求invalidate()方法,就绘制该视图。布局
通常引发invalidate()操做的函数以下:
一、直接调用invalidate()方法,请求从新draw(),但只会绘制调用者自己。
二、setSelection()方法 :请求从新draw(),但只会绘制调用者自己。
三、setVisibility()方法 : 当View可视状态在INVISIBLE转换VISIBLE时,会间接调用invalidate()方法,
继而绘制该View。
4 、setEnabled()方法 : 请求从新draw(),但不会从新绘制任何视图包括该调用者自己。orm
requestLayout()方法 :会致使调用measure()过程 和 layout()过程 。it
说明:只是对View树从新布局layout过程包括measure()和layout()过程,不会调用draw()过程,但不会从新绘制
任何视图包括该调用者自己。io
通常引发invalidate()操做的函数以下:
一、setVisibility()方法:
当View的可视状态在INVISIBLE/ VISIBLE 转换为GONE状态时,会间接调用requestLayout() 和invalidate方法。
同时,因为整个个View树大小发生了变化,会请求measure()过程以及draw()过程,一样地,只绘制须要“从新绘制”的视图。form
requestFocus()函数说明:date
说明:请求View树的draw()过程,但只绘制“须要重绘”的视图。rsa