我正在学习自定义视图,想了解 invalidate()
和 requestLayout()
。
请参考此答案和其图表:
invalidate()
告诉Android视图的状态已经改变,需要重新绘制。
requestLayout()
意味着视图的大小可能已经改变,需要重新测量,然后重新绘制。
invalidate()
将调用 dispatchDraw()
、draw()
和 onDraw()
,因此会重新渲染视图。
另一方面,requestLayout()
几乎需要重新进行从测量到重新渲染的所有操作。
为什么很多例子(甚至是 TextView
的源代码)都会在下一行立即调用 invalidate()
和 requestLayout()
?
requestLayout()
时还要调用invalidate()
。似乎requestLayout()
总是会导致整个视图被重绘;此外再调用invalidate()
似乎是多余的。 - pathfindereliterequestLayout()
(而不使用invalidate()
)也可以呈现新的文本。因此,我的问题是,在需要调用requestLayout()
的情况下,为什么还要调用invalidate()
呢? - pathfindereliterequestLayout()
不会触发onDraw()
。所以你是正确的。链接:http://grokbase.com/p/gg/android-developers/12amz5pqv8/does-an-ondraw-get-called-if-i-dont-do-invalidate-but-did-the-requestlayout - boxme