1. 程式人生 > >自定義View中onMeasure在wrap_content時的處理

自定義View中onMeasure在wrap_content時的處理

今天看書,看到了關於自定義View的技巧,其中關於onMeasure這個方法是必須覆蓋的。原因何在?因為在view的onMeasure方法中,有一個getDefaultSize的方法。方法中,對於AT_MOST和EXACTLY的處理是一樣的。當然這些點都可以在網上找到相關的介紹。程式碼如下

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;
  }
也就是說,我們必須自己處理在wrap_content(AT_MOST)的情況下的view的大小。其推薦的解決方案是給view一個初始值,那我的問題是如何確定這個值呢?

根據view的測量機制,view的子類,比如textview和imageview,其在onMeasure方法中必定也是對wrap_content的情況做了處理。通過檢視原始碼,確實是如此。拿textview的寬度來說,它對wrap_content的情況做的特殊處理就是測量內容(字元)的長度等等,再根據計算結果和傳入的寬度值做比較取小,從而得到那個初始值。

最後,推而廣之,也就是說,在wrap_content時,需要完成對內容的測量。