在 Android 开发中,requestLayout、invalidate 和 postInvalidate 是用于更新视图(View)的方法。它们的作用和触发时机有所不同.
requestLayout
作用
requestLayout 用于请求重新测量和布局视图。调用这个方法后,系统会重新调用视图的测量(measure)、布局(layout)过程。
触发时机
- 当视图的大小或形状发生变化时需要调用。
- 当视图的布局参数(如宽度、高度、边距等)发生变化时需要调用。
view.requestLayout()
注意事项
- requestLayout 会触发整个视图树的重新布局,可能会影响性能,因此应谨慎使用。
invalidate
作用
invalidate 用于请求重新绘制视图。调用这个方法后,系统会在下一个绘制周期重新调用视图的 onDraw 方法。
触发时机
当视图的内容发生变化,需要重新绘制时调用。
view.invalidate()
注意事项
- invalidate 只会重绘当前视图,不会影响视图的测量和布局过程。
- 只能在主线程中调用。
postInvalidate
作用
postInvalidate 也是用于请求重新绘制视图,但它可以在非 UI 线程中调用。调用这个方法后,系统会在下一个绘制周期重新调用视图的 onDraw 方法。
触发时机
当需要在非 UI 线程中请求视图重绘时调用。
view.postInvalidate()
注意事项
- postInvalidate 通过将重新绘制请求放入消息队列来实现线程安全。
- 与 invalidate 不同,它可以在任何线程中调用。
总结
- requestLayout:请求重新测量和布局视图,影响整个视图树的布局过程。通常在视图大小或布局参数变化时调用。
- invalidate:请求重新绘制视图,只影响当前视图的绘制过程。只能在主线程中调用。
- postInvalidate:请求重新绘制视图,允许在非主线程中调用,通过消息队列实现线程安全。