Android, canvas: Как очистить (удалить содержимое) холста (= растровые изображения), живущего в surfaceView?

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

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); } } } } 

Solutions Collecting From Web of "Android, canvas: Как очистить (удалить содержимое) холста (= растровые изображения), живущего в surfaceView?"

Как очистить (или перерисовать) холст WHOLE для нового макета (= попробовать в игре)?

Просто вызовите Canvas.drawColor(Color.BLACK) или любой цвет, который вы хотите очистить от Canvas .

И: как я могу обновить только часть экрана?

Нет такого метода, который просто обновляет «часть экрана», поскольку ОС Android перерисовывает каждый пиксель при обновлении экрана. Но, когда вы не очищаете старые рисунки на своем Canvas , старые рисунки все еще остаются на поверхности, и это, вероятно, один из способов «обновить только часть» экрана.

Итак, если вы хотите «обновить часть экрана», просто не Canvas.drawColor() метод Canvas.drawColor() .

Нарисовать прозрачный цвет с прозрачным режимом PorterDuff делает трюк за то, что я хотел.

 Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) 

Нашел это в группах google, и это сработало для меня ..

 Paint clearPaint = new Paint(); clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); canvas.drawRect(0, 0, width, height, clearPaint); 

Это удаляет рисунки прямоугольников и т. Д., Сохраняя заданное растровое изображение.

Я попробовал ответить @mobistry:

canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);

Но это не сработало для меня.

Решение для меня было следующим:

canvas.drawColor(Color.TRANSPARENT, Mode.MULTIPLY);

Возможно, у кого-то такая же проблема.

 mBitmap.eraseColor(Color.TRANSPARENT); canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 

Используйте метод сброса класса Path

 Path.reset(); 

Для меня вызов Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) или что-то подобное будет работать только после того, как я коснусь экрана. Я бы назвал указанную выше строку кода, но экран будет очищен только после того, как я коснулся экрана. Так что для меня работало, чтобы вызвать invalidate() за которым следует init() который вызывается во время создания для инициализации представления.

 private void init() { setFocusable(true); setFocusableInTouchMode(true); setOnTouchListener(this); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(Color.BLACK); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(6); mCanvas = new Canvas(); mPaths = new LinkedList<>(); addNewPath(); } 

Вот код минимального примера, показывающий, что вам всегда приходится перерисовывать каждый пиксель холста в каждом кадре.

Эта активность рисует новый битмап каждую секунду в SurfaceView, не очищая экран раньше. Если вы проверите это, вы увидите, что растровое изображение не всегда записывается в один и тот же буфер, и экран будет чередоваться между двумя буферами.

Я тестировал его на своем телефоне (Nexus S, Android 2.3.3) и на эмуляторе (Android 2.2).

 public class TestCanvas extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new TestView(this)); } } class TestView extends SurfaceView implements SurfaceHolder.Callback { private TestThread mThread; private int mWidth; private int mHeight; private Bitmap mBitmap; private SurfaceHolder mSurfaceHolder; public TestView(Context context) { super(context); mThread = new TestThread(); mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon); mSurfaceHolder = getHolder(); mSurfaceHolder.addCallback(this); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mWidth = width; mHeight = height; mThread.start(); } @Override public void surfaceCreated(SurfaceHolder holder) {/* Do nothing */} @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mThread != null && mThread.isAlive()) mThread.interrupt(); } class TestThread extends Thread { @Override public void run() { while (!isInterrupted()) { Canvas c = null; try { c = mSurfaceHolder.lockCanvas(null); synchronized (mSurfaceHolder) { c.drawBitmap(mBitmap, (int) (Math.random() * mWidth), (int) (Math.random() * mHeight), null); } } finally { if (c != null) mSurfaceHolder.unlockCanvasAndPost(c); } try { sleep(1000); } catch (InterruptedException e) { interrupt(); } } } } } 

Пожалуйста, вставьте ниже код в конструктор класса classviewview ………….

Кодирование конструктора

  SurfaceHolder holder = getHolder(); holder.addCallback(this); SurfaceView sur = (SurfaceView)findViewById(R.id.surfaceview); sur.setZOrderOnTop(true); // necessary holder = sur.getHolder(); holder.setFormat(PixelFormat.TRANSPARENT); 

Кодирование xml

  <com.welcome.panelview.PanelViewWelcomeScreen android:id="@+id/one" android:layout_width="600px" android:layout_height="312px" android:layout_gravity="center" android:layout_marginTop="10px" android:background="@drawable/welcome" /> 

Попробуйте код выше …

 canvas.drawColor(Color.TRANSPARENT, Mode.MULTIPLY); 

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

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

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

canvas.drawColor (Color.TRANSPARENT)