2012-06-20 113 views
1

我有一個SurfaceView,它必須在兩個位圖之間或之上繪製一條路徑。我將動畫繪製路徑,以使其看起來變成全尺寸。此代碼的工作原理提供我不繪製位圖。Canvas#drawBitmap正在挫敗Canvas#在SurfaceView中繪製路徑

位圖的規定(在onLayout(...),得到View尺寸)是這樣的:

mFrontBitmap = Bitmap.createBitmap((int) width, (int) height, mConfig); 
Canvas temp = new Canvas(mFrontBitmap); 
temp.drawColor(Color.TRANSPARENT, Mode.CLEAR); 

(我擦拭,以免留下任何機會。)然後裏面的抽獎碼SurfaceView線程的run方法是

if(mCurrentLayer==Layer.BACK) { 
    //draw path 
    if(mPath!=null) 
    canvas.drawPath(mPath, mPaint); 
} 

canvas.drawBitmap(mBackBitmap, 0, 0, null); 

if(mCurrentLayer==Layer.MIDDLE) { 
    //draw path 
    if(mPath!=null) 
     canvas.drawPath(mPath, mPaint); 
} 

canvas.drawBitmap(mFrontBitmap, 0, 0, null); 

if(mCurrentLayer==Layer.FRONT) { 
    //draw path 
    if(mPath!=null) 
     canvas.drawPath(mPath, mPaint); 
} 

隨着註釋掉兩條drawBitmap線,動畫渲染罰款。有了它們,在動畫完成之前我什麼都看不到,然後將路徑直接渲染到其中一個位圖上。我有些失落。我已經看過LunarLander示例,它正在渲染一個背景位圖,所以這顯然是SurfaceView可以做的,但對我來說它不會。會是什麼呢?

回答

-1

到你想要的位圖的內容,您可以使用每次做canvas.drawPath(...)這個時間每次得出:

mpath.invalidate(); 

(我假設的mpath是視圖/ surfaceview)。

因此,這將是這樣的:

if(mCurrentLayer==Layer.BACK) { 
    //draw path 
    if(mPath!=null) { 
     canvas.drawPath(mPath, mPaint); 
     mPath.invalidate(); 
    } 
} 

canvas.drawBitmap(mBackBitmap, 0, 0, null); 

if(mCurrentLayer==Layer.MIDDLE) { 
    //draw path 
    if(mPath!=null) { 
     canvas.drawPath(mPath, mPaint); 
     mPath.invalidate(); 
    } 
} 

canvas.drawBitmap(mFrontBitmap, 0, 0, null); 

if(mCurrentLayer==Layer.FRONT) { 
    //draw path 
    if(mPath!=null) { 
     canvas.drawPath(mPath, mPaint); 
     mPath.invalidate(); 
    } 
} 
+0

'mPath'實際上是一個'Path'對象; 'Path'中沒有'invalidate()'方法。 'SurfaceView'有一個'SurfaceHolder',而不是像''View''一樣從'onDraw()'繪圖,你運行一個調用'Canvas canvas = mSurfaceHolder.lockCanvas()'的線程,它可以讓你在'Canvas'目的;然後在最後調用'mSurfaceHolder.unlockCanvasAndPost(canvas)'(據推測)將畫布放到表面上。因此,您不需要'使()'失效,但是無論如何感謝。 –