Ers*_*man 13 android android-view android-view-invalidate
我正在学习自定义视图,并希望了解invalidate()
和requestLayout()
.
请参考这个答案及其图表:
invalidate()
告诉Android视图的状态已经改变,需要重新绘制.
requestLayout()
表示视图的大小可能已更改,需要重新测量,然后重新绘制.
invalidate()
将调用dispatchDraw()
,draw()
并onDraw()
因此重新呈现视图.
requestLayout()
另一方面,从测量再到再次渲染,几乎可以做任何事情.
为什么那么多的例子(甚至是TextView
源代码)都会调用invalidate()
,然后requestLayout()
就在下一行呢?
Mic*_*use 11
invalidate()
专门用于重绘视图内容.重绘不会同步发生.相反,它会将视图区域标记为无效,以便在下一个渲染周期中重绘它.
requestLayout()
应该在其中的某些东西可能改变其尺寸时使用.在这种情况下,父视图和视图层次结构中的所有其他父项将需要通过布局传递重新调整自己.
如果您没有对您的视图做任何会改变其大小的事情,那么您不必打电话requestLayout()
.
如果您回过头来查看代码TextView
中requestLayout()
要调用的位置的位置,那么它将会受到影响视图边界的方法的影响.例如,setPadding()
,setTypeface()
,setCompoundDrawables()
,等.
因此,在requestLayout()
调用时,它应该与对invalidate的调用配对,以确保重绘整个视图.
看到下面的图表后,我的印象是调用requestLayout()
最终会导致onDraw
.
因此,没有必要将这些称为一起,因为它是多余的.
invalidate();
requestLayout();
Run Code Online (Sandbox Code Playgroud)
然而,事实证明该图表具有误导性.有些视图实际上可能会在布局更改时自行失效,但这不是确定的.不能保证呼叫被调用.requestLayout()
onDraw
我的来源(感谢此评论)是Romain Guy(Google的Android工程师):
requestLayout()本身不会导致绘图传递,但是某些视图可能会通过调用invalidate来对布局更改做出反应.
因此,要确定重新布局会导致重绘,那么您应该invalidate()
与之配对requestLayout()
.(但事实并非如此.如果你只需要重绘,那么就没有必要打电话了requestLayout()
.一个人invalidate()
会这么做.)
归档时间: |
|
查看次数: |
6679 次 |
最近记录: |