我正在学习自定义视图,并想了解invalidate()
和requestLayout()
。
请参考此答案及其图表:
https://stackoverflow.com/a/25846243/4243687invalidate()
告诉android视图的状态已经改变,需要重新绘制。requestLayout()
表示视图的大小可能已更改,需要重新测量,然后重新绘制。invalidate()
将调用dispatchDraw()
、draw()
和onDraw()
从而重新呈现视图。requestLayout()
另一方面,从测量到重新渲染,几乎无所不包。
为什么会有这么多的例子(甚至是TextView
源代码)调用invalidate()
,然后在下一行调用requestLayout()
?
最佳答案
invalidate()
专门用于重新绘制视图的内容。重画不是同步发生的。相反,它会将视图的区域标记为无效,以便在下一个渲染周期中重新绘制。requestLayout()
应该在其内部的某些东西可能改变了其尺寸时使用。在这种情况下,父视图和视图层次结构上的所有其他父视图将需要通过布局过程重新调整自己。
如果您没有对视图执行任何更改其大小的操作,则不必调用requestLayout()
。
如果返回并查看代码中调用TextView
的位置,它将位于视图边界将受到影响的方法上。例如,requestLayout()
,setPadding()
,setTypeface()
等。
因此,当调用setCompoundDrawables()
时,应该将其与invalidate调用配对,以确保重新绘制整个视图。