如果View確定自身不再適合當(dāng)前區(qū)域,比如說它的LayoutParams發(fā)生了改變霸琴,需要父布局對其進行重新測量梧乘、布局、繪制這三個流程仁堪,使用requestLayout弦聂。而invalidate則是刷新當(dāng)前View,使當(dāng)前View進行重繪,不會進行測量堡纬、布局流程
postInvalidate法與invalidate方法的作用是一樣的,都是使View樹重繪,postInvalidate是在非UI線程中調(diào)用悴灵,invalidate則是在UI線程中調(diào)用
invalidate方法感覺起來好像很重骂蓖,其實setVisibility(), setText()等方法都是會調(diào)用invalidate來重繪draw
在ListView
,Recyclerview
的使用中叮喳,因為它們會緩存Item的布局,如果布局設(shè)置了weight=1
類似的屬性,那么效果看起來就不符合預(yù)期,這時需要weight=1
的控件調(diào)用requestLayout()
來重新測量一下寬度
參考:
Android View 深度分析requestLayout、invalidate與postInvalidate