Canvas # drawBitmap мешает Canvas # drawPath в SurfaceView

1

У меня есть 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 может сделать, но для меня это не будет. Что бы это могло быть?

Теги:
draw
path
surfaceview
bitmap

1 ответ

-1

Чтобы рисовать каждый раз, когда вы хотите содержимое растровых изображений, вы можете использовать его каждый раз, когда вы делаете 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();
    }
}
  • 0
    mPath самом деле mPath - это объект Path ; в Path нет метода invalidate() . SurfaceView имеет SurfaceHolder и вместо рисования от onDraw() , как другой View s вы запускаете поток, вызывающий Canvas canvas = mSurfaceHolder.lockCanvas() , который позволяет рисовать на Canvas объекта; затем в конце вы вызываете mSurfaceHolder.unlockCanvasAndPost(canvas) который (предположительно) помещает холст на поверхность. Таким образом, вам не нужно invalidate() но все равно спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню