自定義View中onMeasure在wrap_content時的處理
阿新 • • 發佈:2019-01-09
今天看書,看到了關於自定義View的技巧,其中關於onMeasure這個方法是必須覆蓋的。原因何在?因為在view的onMeasure方法中,有一個getDefaultSize的方法。方法中,對於AT_MOST和EXACTLY的處理是一樣的。當然這些點都可以在網上找到相關的介紹。程式碼如下
也就是說,我們必須自己處理在wrap_content(AT_MOST)的情況下的view的大小。其推薦的解決方案是給view一個初始值,那我的問題是如何確定這個值呢?public static int getDefaultSize(int size, int measureSpec) { int result = size; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); switch (specMode) { case MeasureSpec.UNSPECIFIED: result = size; break; case MeasureSpec.AT_MOST: case MeasureSpec.EXACTLY: result = specSize; break; } return result; }
根據view的測量機制,view的子類,比如textview和imageview,其在onMeasure方法中必定也是對wrap_content的情況做了處理。通過檢視原始碼,確實是如此。拿textview的寬度來說,它對wrap_content的情況做的特殊處理就是測量內容(字元)的長度等等,再根據計算結果和傳入的寬度值做比較取小,從而得到那個初始值。
最後,推而廣之,也就是說,在wrap_content時,需要完成對內容的測量。