这篇文章上次修改于 2342 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

requestLayout()

View.requestLayout();

调用该方法,控件会重新执行 onMeasure()onLayout()onDraw() 这三个方法。

layout()

View.layout(int l, int t, int r, int b)

调用该方法会执行 onLayout() 方法,但 Android 5.0之后的代码有所不同,因为引入了 NestedScrolling,所以该调用也可能会执行 onMeasure()

if ((mPrivateFlags3 & PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT) != 0) {
    onMeasure(mOldWidthMeasureSpec, mOldHeightMeasureSpec);
    mPrivateFlags3 &= ~PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT;
}

invalidate()

View.invalidate()

调用该方法,控件会重新执行 onDraw()

postInvalidate()

View.postInvalidate();

调用该方法,与 invalidate() 方法效果一样,区别在于 invalidate() 方法是在UI线程中调用,postInvalidate() 是在非UI线程中调用。