Android中刷新View的方法有以下幾種:
-
調用invalidate()方法,該方法會使View樹中的所有視圖無效或臟,等待下一次繪制時重新繪制。例如:
mCustomView.invalidate();
-
調用postInvalidate()方法,該方法類似于invalidate()方法,不同之處在于該方法可以在非UI線程中調用。例如:
mCustomView.postInvalidate();
-
調用View的requestLayout()方法,該方法會使View重新計算大小和位置,并調用onMeasure、onLayout等方法進行布局。例如:
mCustomView.requestLayout();
invalidate() 和 requestLayout() 都會觸發 View 的重新繪制,但是它們的作用是不同的。
invalidate() 會使 View 標記為無效,在 UI 線程空閑時重新繪制,因此它不會立即觸發 View 的重新繪制,和執行次數多少無關,可以多次調用。invalidate() 的作用是告訴系統對該 View 進行重繪,如果 View 沒有變化,那么它不會重新繪制,因此不會立即占用 CPU 資源。
requestLayout() 會使 View 的大小和布局都重新計算,因此它需要更多的 CPU 資源,它會在下一次的 measure 和 layout 過程中計算 View 的大小和位置,并重新布局。這個過程可能會非常消耗性能,因此應該盡量避免多次調用 requestLayout(),并在合適的時機調用。
因此,一般來說,invalidate() 比 requestLayout() 消耗的性能更少,但是具體情況需要根據實際場景來選擇。如果只是 View 內部或者子 View 發生了改變,那么可以使用 invalidate();如果 View 的大小或者位置發生了改變,則需要重新布局,那么可以使用 requestLayout()。