У меня есть SurfaceView
который должен нарисовать путь ниже, между двумя растровыми изображениями или над ними. Я оживляю рисунок пути таким образом, чтобы он, казалось, вырос до полного размера. Этот код работает при условии я не рисую растровых изображений.
Растровые изображения указываются (в onLayout(...)
, чтобы получить размеры View
) следующим образом:
mFrontBitmap = Bitmap.createBitmap((int) width, (int) height, mConfig);
Canvas temp = new Canvas(mFrontBitmap);
temp.drawColor(Color.TRANSPARENT, Mode.CLEAR);
(Я вытираю их, чтобы не оставлять ничего случайно). Затем код рисования внутри SurfaceView
запуска потока SurfaceView
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
может сделать, но для меня это не будет. Что бы это могло быть?
Чтобы рисовать каждый раз, когда вы хотите содержимое растровых изображений, вы можете использовать его каждый раз, когда вы делаете canvas.drawPath(...):
mpath.invalidate();
(Я предполагаю, что mpath - это view/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();
}
}
mPath
самом делеmPath
- это объектPath
; вPath
нет методаinvalidate()
.SurfaceView
имеетSurfaceHolder
и вместо рисования отonDraw()
, как другойView
s вы запускаете поток, вызывающийCanvas canvas = mSurfaceHolder.lockCanvas()
, который позволяет рисовать наCanvas
объекта; затем в конце вы вызываетеmSurfaceHolder.unlockCanvasAndPost(canvas)
который (предположительно) помещает холст на поверхность. Таким образом, вам не нужноinvalidate()
но все равно спасибо.