Android draw、onDraw、dispatchDraw、invalidate、computeScroll 一些簡要說明

銳湃發表於2015-12-15

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 drawingTime) {

        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。


轉自:http://blog.csdn.net/jjwwmlp456/article/details/43986141

相關文章