Android, холст: как очистить (удалить содержимое) холст (= растровые изображения), находящиеся в SurfaceView? - PullRequest
86 голосов
/ 20 апреля 2011

Чтобы сделать простую игру, я использовал шаблон, который рисует холст с растровыми изображениями, подобными этому:

private void doDraw(Canvas canvas) {
    for (int i=0;i<8;i++)
        for (int j=0;j<9;j++)
            for (int k=0;k<7;k++)   {
    canvas.drawBitmap(mBits[allBits[i][j][k]], i*50 -k*7, j*50 -k*7, null); } }

(холст определен в «run ()» / SurfaceView живет вGameThread.)

Мой первый вопрос: как очистить (или перерисовать) целое полотно для нового макета?
Во-вторых, как мне обновить только часть экрана??

// This is the routine that calls "doDraw":
public void run() {
    while (mRun) {
        Canvas c = null;
        try {
            c = mSurfaceHolder.lockCanvas(null);
            synchronized (mSurfaceHolder) {
                if (mMode == STATE_RUNNING) 
                    updateGame();
                doDraw(c);          }
        } finally {
            if (c != null) {
                mSurfaceHolder.unlockCanvasAndPost(c);  }   }   }       }

Ответы [ 13 ]

0 голосов
/ 12 августа 2018

Мне пришлось использовать отдельный проход для прорисовки холста (блокировка, рисование и разблокировка):

Canvas canvas = null;
try {
    canvas = holder.lockCanvas();
    if (canvas == null) {
        // exit drawing thread
        break;
    }
    canvas.drawColor(colorToClearFromCanvas, PorterDuff.Mode.CLEAR);
} finally {
    if (canvas != null) {
        holder.unlockCanvasAndPost(canvas);
    }
}
0 голосов
/ 08 апреля 2013

Ваше первое требование, как очистить или перерисовать весь холст - Ответ - используйте метод canvas.drawColor (color.Black) для очистки экрана с цветом черного или любым другим указанным вами значением.

Ваше второе требование, как обновить часть экрана. Ответьте, например, если вы хотите оставить все остальные элементы неизменными на экране, но в небольшой области экрана, чтобы отображалось целое число (например, счетчик), которое увеличивается после каждого пять секунд затем используйте метод canvas.drawrect, чтобы нарисовать эту маленькую область, указав левый верхний правый нижний и нарисовать. затем вычислите значение вашего счетчика (используя postdalayed в течение 5 секунд и т. д., например, Handler.postDelayed (Runnable_Object, 5000);), преобразуйте его в текстовую строку, вычислите координаты x и y в этом маленьком прямоугольнике и используйте текстовое представление для отображения значение счетчика.

0 голосов
/ 29 ноября 2011

Просто позвоните

canvas.drawColor (Color.TRANSPARENT)

...