2010-03-11 54 views
16

我想畫一個動畫。爲此,我擴展了View並重寫了onDraw()方法。我所期望的是,每次調用onDraw()時,畫布將處於我將其放入的狀態,並且我可以選擇將其清除或僅繪製其中的一部分(這是我使用SurfaceView時的工作方式),但每次畫布回來時都已清除。有沒有辦法讓我清除?或者,也許將以前的狀態保存到一個位圖中,這樣我就可以繪製該位圖,然後繪製它的頂部?Android View.onDraw()總是有一個乾淨的畫布

回答

28

我不確定是否有辦法。但對於我的自定義視圖,我要麼在每次調用onDraw()時重繪所有內容,要麼繪製到位圖,然後將位圖繪製到畫布上(就像您在問題中所建議的那樣)。

這裏是我如何做到這一點

class A extends View { 

    private Canvas canvas; 
    private Bitmap bitmap; 

    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     if (bitmap != null) { 
      bitmap .recycle(); 
     } 
     canvas= new Canvas(); 
     bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     canvas.setBitmap(bitmap); 
    } 
    public void destroy() { 
     if (bitmap != null) { 
      bitmap.recycle(); 
     } 
    } 
    public void onDraw(Canvas c) { 
     //draw onto the canvas if needed (maybe only the parts of animation that changed) 
     canvas.drawRect(0,0,10,10,paint); 

     //draw the bitmap to the real canvas c 
     c.drawBitmap(bitmap, 
      new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), 
      new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null); 
    } 
} 
+0

我只是在一小會兒之前就明白了這一點!感謝您的輸入! – CaseyB 2010-03-11 16:43:43

+0

繪製緩衝區可以正常工作,但是這個巨大的drawBitmap()方法吃了大量的FPS :( – 2011-08-13 20:00:42

+0

這對我來說現在是一個瓶頸 - 每次在onDraw中繪製全屏位圖以恢復以前的狀態幾乎不會影響高分辨率設備的FPS就像Kindle 8.9第三代產品,帶有2560x1600)真的沒有辦法強制畫布堅持以前的狀態嗎?深入OpenGL可能可以解決性能問題,但它不是那時候的方式 – 2014-02-26 21:32:14

1

您應該看看here來查看基本視圖和surfaceView之間的區別。一個surfaceView有一個繪圖的專用圖層,我認爲它可以跟蹤你之前畫的東西。現在,如果你真的想在基本視圖上做到這一點,你可以嘗試把你繪製的每個項目放在一個數組中,例如itemized overlay for the mapview的例子。 它應該幾乎相同的方式

+0

我看到了那個頁面。事實上,該頁面最初引導我使用SurfaceView,但後來我發現SurfaceView不能具有透明背景。我需要這個小部件能夠坐在其他視圖之上。 – CaseyB 2010-03-11 08:07:22

+0

然後嘗試繪製數組? – Sephy 2010-03-11 09:07:56

+0

在現代Android中,如果您想要使用OpenGL路線,您可以使用紋理視圖。 – Adam 2014-07-02 07:55:32

0

您的預期不不願寄希望於瓦特/現實:)畫布不會是你離開的方式,但它不是空白。您可以創建要繪製的對象的ArrayList(canvas.drawCircle(),canvas.drawBitmap()等),然後遍歷OnDraw()中的ArrayList。我是圖形編程新手,但我已經在小範圍內使用它。也許有更好的方法。

+0

它是如果你創建畫布。通過這種方式,您可以完全控制所繪製的內容。 – CaseyB 2010-03-31 21:05:12

+0

而不是Arraylist:您可以使用Picture類記錄繪圖調用。 – 2013-06-04 07:27:33