如果View确定自身不再适合当前区域,比如说它的LayoutParams发生了改变,需要父布局对其进行重新测量、布局、绘制这三个流程,使用requestLayout。而invalidate则是刷新当前View,使当前View进行重绘,不会进行测量、布局流程
postInvalidate法与invalidate方法的作用是一样的,都是使View树重绘,postInvalidate是在非UI线程中调用,invalidate则是在UI线程中调用
invalidate方法感觉起来好像很重,其实setVisibility(), setText()等方法都是会调用invalidate来重绘draw
在ListView
,Recyclerview
的使用中,因为它们会缓存Item的布局,如果布局设置了weight=1
类似的属性,那么效果看起来就不符合预期,这时需要weight=1
的控件调用requestLayout()
来重新测量一下宽度
参考:
Android View 深度分析requestLayout、invalidate与postInvalidate
网友评论