2012-06-20 81 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)'(据推测)将画布放到表面上。因此,您不需要'使()'失效,但是无论如何感谢。 –