【Android View】requestLayout、invalidate与postInvalidate

上来先说结论,一言以蔽之:

requestLayout方法会导致View的onMeasure、onLayout、onDraw方法被调用;invalidate方法则只会导致View的onDraw方法被调用

具体原理可见文章末尾的这几篇博客,说的已经非常详细,这里只对要点进行记录。

相似点

都采用了逐层上报的思想

区别

requestLayout()

子View调用requestLayout方法,会标记当前View及父容器,同时逐层向上提交,直到ViewRootImpl处理该事件,ViewRootImpl会调用三大流程,从measure开始,对于每一个含有标记位的view及其子View都会进行测量、布局、绘制。

invalidate()

当子View调用了invalidate方法后,会为该View添加一个标记位,同时不断向父容器请求刷新,父容器通过计算得出自身需要重绘的区域,直到传递到ViewRootImpl中,最终触发performTraversals方法,进行开始View树重绘流程(只绘制需要重绘的视图)。

postInvalidate()

这个方法与invalidate方法的作用是一样的,都是使View树重绘,但两者的使用条件不同,postInvalidate是在非UI线程中调用,invalidate则是在UI线程中调用。

总结

如果控件仅需要重绘,不涉及LayoutParams等的改变,使用 invalidate() 或 postInvalidate() 即可。而如果View确定自身不再适合当前区域,就需要使用requestLayout()了。

延伸阅读

Android View 深度分析requestLayout、invalidate与postInvalidate
invalidate()、requestLayout() 区别
requestLayout in layout问题

你可能感兴趣的:(笔记,安卓基础知识,android,ui,java)