Android自定義view中,onDraw和onLayout對比

山有木xi 發表於 2021-03-28

在Android的各個view中,要想顯示出來就必須經過測量,佈局和繪製這幾個過程

onMeasure

onMeasure的作用是測量控制元件的大小,當我們建立一個View(呼叫構造方法)的時候其實是不需要測量控制元件的大小,只有將這個view放入一個父控制元件中的時候才需要測量,而這個測量方法就是父控制元件喚起呼叫的。當控制元件的父控制元件要放置該控制元件的時候,父控制元件會呼叫子控制元件的onMeasure方法詢問子控制元件的大小,這並不是本篇文章的主角,因為onMeasure在自定義view中是永遠無法避免的,也不是最佔資源的

onLayout

onLayout實際上比onMeasure要簡單的多了,它的作用就是決定和改變控制元件的位置,因為不是所有的控制元件都需要預設的位置(左上角)或者直接match_parent,這個時候onLayout的作用就出來了,就是佈局

onDraw

說完測繪,說完佈局,就要說說最重要的一點,那就是繪製onDraw——繪製view,它的作用是將自定義View畫出,它的大致步驟可以分為

  1. 繪製背景
  2. 繪製自己的內容(onDraw())
  3. 繪製子view(dispatchDraw())
  4. 繪製裝飾

而在draw裡面,也可以設定控制元件的位置,因為它是通過畫筆畫出來的,既然是通過

canvas?.drawBitmap(bitmap, src, dst, paint)

那就理所應當的可以設定位置,對於需要繪製的控制元件較少的自定義view來說,其實是差別不大,但是在我之前的一個專案中,需要繪製大概接近100個控制元件,這個時候如果還是採用postInvalidate來重新呼叫onDraw,就非常的消耗效能

Android自定義view中,onDraw和onLayout對比

這是我收集到不同佈局的資料,單位為毫秒(ms),可以看到,在相同佈局下,onDraw所耗時比onLayout要多上許多,同樣的消耗資源也要多上許多,這就導致了較為嚴重的卡頓,也就是說,在我們不改變佈局的樣式大小的情況下,只是修改其位置,直接通過屬性動畫改變其layout中的值,其實會帶來更好的體驗

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2765313/,如需轉載,請註明出處,否則將追究法律責任。