Android draw、onDraw、dispatchDraw、invalidate、computeScroll 一些簡要說明
View中:
public void draw(Canvas canvas) {
/*
1. Draw the background 繪製背景
2. If necessary, save the canvas' layers to prepare for fading 如有必要,顏色漸變淡之前儲存畫布層(即鎖定原有的畫布內容)
3. Draw view's content 繪製view的內容
4. Draw children 繪製子view
5. If necessary, draw the fading edges and restore layers 如有必要,繪製顏色漸變淡的
6. Draw decorations (scrollbars for instance) 繪製裝飾,比如滾動條
*/
...
if (!dirtyOpaque) {
drawBackground(canvas); //背景繪製
}
// skip step 2 & 5 if possible (common case) 通常情況跳過第2和第5步
...if (!dirtyOpaque) onDraw(canvas); //呼叫onDraw
dispatchDraw(canvas); //繪製子view
onDrawScrollBars(canvas); //繪製滾動條
...
}
protected void dispatchDraw(Canvas canvas) { //空實現 }
protected void onDraw(Canvas canvas) { //空實現 }
ViewGroup中:
protected void dispatchDraw(Canvas canvas) {
...
drawChild(...); //繪製子view
...
}
protected boolean drawChild(Canvas canvas, View child, long
return child.draw(canvas, this, drawingTime);
}
說明:
1. 自定義一個view時,重寫onDraw。
呼叫view.invalidate(),會觸發onDraw和computeScroll()。前提是該view被附加在當前視窗上
view.postInvalidate(); //是在非UI執行緒上呼叫的
2. 自定義一個ViewGroup,重寫onDraw。
onDraw可能不會被呼叫,原因是需要先設定一個背景(顏色或圖)。
表示這個group有東西需要繪製了,才會觸發draw,之後是onDraw。
因此,一般直接重寫dispatchDraw來繪製viewGroup
3. 自定義一個ViewGroup
dispatchDraw會呼叫drawChild。