自定義View需要注意的問題

自定義View的分類

  1. 繼承View重寫onDraw方式
    這種方式主要用來實現一些不規則的自定義View
    需要自己處理wrap_content的情況 因爲默認的View對wrap_content沒做特殊處理,只把這種情況當做match_parent處理 而且padding也需要自己處理 margin不用 因爲margin是父容器確定的
  2. 繼承ViewGroup派生特殊的Layout
    這種方式稍微複雜一些,它需要處理onMeasure和onLayout這兩個函數 完成測量和佈局的工作 並且需要自行處理wrap_content情況
  3. 繼承特定的View(比如TextView等)
    此種方式比較常見,一般用於擴展一種已經存在的View的功能 此方法比較容易實現 不需要自己處理 wrap_content和padding
  4. 繼承特定的ViewGroup(比如LinearLayout)
    此種方式比較常見,相比第二種方法簡單許多,因爲它已經有默認的onMeasure和onLayout的實現 並且已經處理了wrap_content和padding
    通常這種方式和方法二的實現是互通的 ,這個方法可以實現的方法二也可以實現,方法二能實現的這個也能實現,只不過方法二比較麻煩,但是貼近底層,貼近底層效率就會高一點,方法四比較簡單

自定義View要注意的問題

  1. 讓View支持wrap_content
    直接繼承View或ViewGroup的控件 都不支持wrap_content 方法 需要在onMeasure方法中設置
  2. 如果有必要 支持padding
    直接繼承View的控件,如果不在onDraw方法中處理padding 那麼padding屬性是無法起作用的 直接繼承ViewGroup的控件,需要處理padding和子元素的margin對其的影響,否則這兩個屬性也無效
  3. 儘量不要在view中使用handler 因爲view提供了post方法
    View內部本身就提供了post系列方法 可以代替handler 但如果明確需要Handler 可以使用
  4. view中有線程或者動畫 要及時停止
    這是爲了防止內存泄漏,可以在onDetachedFromWindow方法中結束,這個方法回調的時機是 當View的Activity退出或者當前View被移除的時候 會調用 這時候是結束動畫或者線程的好時機 另外還有一個對應的方法 onAttachedToWindow 這個方法調用的時機是在包含View的Activity啓動時 回調 回調在onDraw方法 之前
  5. 有嵌套滑動效果時 注意處理滑動衝突
發佈了6 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章