irpas技术客

【Android View】requestLayout、invalidate与postInvalidate_WayneSun729_android reques

网络投稿 5017

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

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问题


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Android