Как убрать краски на поверхность в андроиде - PullRequest
0 голосов
/ 16 марта 2012

Здесь мне нужно удалить краски. Я делал краски, используя кнопку удаления поверхности viewinsign. Я использую приведенный ниже код. Теперь, когда я нажимаю кнопку «Стереть», нарисованные краски стираются. Но теперь снова рисовать означает, что краски не видны. Пожалуйста, помогите мне.

  public void onClick(View view){
    if(view==erasebtn)
           {
               if (!currentDrawingPath.isEmpty()) {
       currentPaint .setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        action=true;
    }
             }
}

1 Ответ

0 голосов
/ 16 марта 2012

Если вы хотите полностью стереть весь рисунок, вы должны залить его «пустым» цветом.

Если у вас есть холст, на котором вы рисуете:

canvas.drawColor(Color.WHITE);

Если вы нарисовали линии и т. Д. В Canvas, где вы просто все время добавляете свои рисунки, то вам нужно создать способ восстановить старую версию этого. Изменение Paint, которое вы использовали для рисования, не изменит того, что вы уже нарисовали. Это просто влияет на то, как будет сделан любой будущий рисунок.

Есть несколько возможностей сделать это, например. должно работать следующее:

Bitmap bitmap = Bitmap.createBitmap(400, 400, null);
Canvas canvas = new Canvas(bitmap);
ByteBuffer buffer = ByteBuffer.allocate(bitmap.getByteCount());

//save the state
bitmap.copyPixelsToBuffer(buffer);

// draw something
canvas.drawLine();

// restore the state
bitmap.copyPixelsFromBuffer(buffer):

Таким образом, вы можете вернуться в 1 состояние. Если вам нужно отменить больше шагов, подумайте о сохранении растровых изображений на диск, так как в противном случае они будут занимать довольно много памяти.

Другая возможность - сохранить все те шаги, которые вы нарисовали численно, в списке (например, векторную графику) таким образом, чтобы вы могли перерисовать полное изображение до определенной точки - тогда вы можете просто отменить рисование, рисуя только Первая часть вашего списка на свежее изображение.

Изменить: Будет ли это работать, если вы добавите это в код и использовать его вместо undo()?

// add me to the code that has undo()
public void undoAll (){  
  final int length = currentStackLength();  
  for (int i = lenght - 1; i >= 0; i--) {
    final DrawingPath undoCommand = currentStack.get(  i  );  
    currentStack.remove( i );
    undoCommand.undo();  
    redoStack.add( undoCommand );  
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...