Андроидный холст удалить предыдущий путь

Я создаю приложение для рисования и хочу реализовать функцию отмены, чтобы удалить предыдущий предыдущий обратный путь.

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

private HashMap<Integer, Path> pathMap; // current Paths being drawn private HashMap<Integer, Point> previousPointMap; // current Points private Bitmap bitmap; // drawing area for display or saving private Canvas bitmapCanvas; // used to draw on bitmap private Paint paintScreen; // use to draw bitmap onto screen private Paint paintLine; // used to draw lines onto bitmap public DrawView(Context context, AttributeSet attrs) { super(context, attrs); // pass context to View's constructor this.context_new=context; paintScreen = new Paint(); // used to display bitmap onto screen // set the initial display settings for the painted line paintLine = new Paint(); paintLine.setAntiAlias(true); // smooth edges of drawn line paintLine.setColor(Color.BLACK); // default color is black paintLine.setStyle(Paint.Style.STROKE); // solid line paintLine.setStrokeWidth(5); // set the default line width paintLine.setStrokeCap(Paint.Cap.ROUND); // rounded line ends pathMap = new HashMap<Integer, Path>(); previousPointMap = new HashMap<Integer, Point>(); } // end DrawView constructor @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(bitmap, 0, 0, paintScreen); for (Integer key : pathMap.keySet()) canvas.drawPath(pathMap.get(key), paintLine); } // called when the user finishes a touch private void touchEnded(int lineID) { Path path = pathMap.get(lineID); // get the corresponding Path bitmapCanvas.drawPath(path, paintLine); // draw to bitmapCanvas path.reset(); // reset the Path rememberLineId = lineID; } // end method touch_ended //undo private void undo() { Path path = pathMap.get(rememberLineId); // get the corresponding Path pathMap.remove(rememberLineId); bitmapCanvas.clearPath(path, paintLine); path.reset(); // reset the Path } 

Вопрос:

Однако, похоже, нет bitmapCanvas.clearPath этот метод? Если тогда, как это можно изменить?

Изменены коды:

Объявления:

 private Bitmap bitmap; // drawing area for display or saving private Canvas bitmapCanvas; // used to draw on bitmap private Paint paintScreen; // use to draw bitmap onto screen private Paint paintLine; // used to draw lines onto bitmap private HashMap<Integer, Path> pathMap; // current Paths being drawn private HashMap<Integer, Point> previousPointMap; // current Points private Bitmap bitmapBackup; 

OnSizeChanged

 @Override public void onSizeChanged(int w, int h, int oldW, int oldH) { super.onSizeChanged(w, h, oldW, oldH); DoodlzViewWidth = w; DoodlzViewHeight = h; bitmapBackup = Bitmap.createBitmap(getWidth(), DoodlzViewHeight, Bitmap.Config.ARGB_8888); bitmap = Bitmap.createBitmap(getWidth(), DoodlzViewHeight, Bitmap.Config.ARGB_8888); bitmapCanvas = new Canvas(bitmap); bitmap .eraseColor(Color.WHITE); // erase the BitMap with white bitmapBackup.eraseColor(Color.WHITE); } 

FirsttoBackup метод, будет вызываться, когда ниже TouchedStart выполняет

 public void firsttobackup() { bitmapBackup=bitmap; Toast message = Toast.makeText(getContext(), "backuped 123", Toast.LENGTH_SHORT); message.show(); //THIS TOAST CAN BE SUCESSFULLY PRESENTED when touching screen starting to draw } 

OnDraw

 @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(bitmap, 0, 0, paintScreen); for (Integer key : pathMap.keySet()) canvas.drawPath(pathMap.get(key), paintLine); 

}

OnTouchEvent

 @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getActionMasked(); // event type int actionIndex = event.getActionIndex(); // pointer (ie, finger) if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN) { firsttobackup(); //TOAST CAN SHOW "BACKUP 123" touchStarted(event.getX(actionIndex), event.getY(actionIndex), event.getPointerId(actionIndex)); } 

Отменить: пользователь, нажавший кнопку отмены, вызовет это

 public void undo() { bitmap = bitmapBackup.copy(Bitmap.Config.ARGB_8888, true); bitmapCanvas = new Canvas(bitmap); } 

Пересмотренный вопрос:

Теперь метод firsttobackup() используется так, что bitmapBackup установил = bitmap при выполнении OnTouchEvent touchStarted . Я вложил в него тост, и вам нужно будет предоставить «резервную копию 123», когда пользователь нажимает на экран и начинает рисовать.

Когда пользователь нажимает кнопку отмены, он будет вызывать метод undo , но теперь, нажав кнопку отмены, никаких действий не видно … почему?

Благодаря!!

Solutions Collecting From Web of "Андроидный холст удалить предыдущий путь"

Я думаю, что самый простой способ сделать это – иметь 2 растровых изображения (1 дополнительный битмап резервного копирования для восстановления предыдущего состояния).

Перед началом работы с новыми чертежами необходимо сохранить предыдущее состояние растрового изображения.

Вот как я бы изменил ваш код:

  private HashMap<Integer, Path> pathMap; // current Paths being drawn private HashMap<Integer, Point> previousPointMap; // current Points private Bitmap bitmap; // drawing area for display or saving private Bitmap bitmapBackup; private Canvas bitmapCanvas; // used to draw on bitmap private Canvas bitmapBackupCanvas; // remember last bitmap before new drawings... private void touchStarted() { bitmapBackupCanvas.drawBitmap(bitmap, 0, 0, null); } // called when the user finishes a touch private void touchEnded(int lineID) { Path path = pathMap.get(lineID); // get the corresponding Path bitmapCanvas.drawPath(path, paintLine); // draw to bitmapCanvas path.reset(); // reset the Path rememberLineId = lineID; } // end method touch_ended //undo private void undo() { Path path = pathMap.get(rememberLineId); // get the corresponding Path pathMap.remove(rememberLineId); bitmapCanvas.drawBitmap(bitmapBackup, 0, 0, null); // restore from backup path.reset(); // reset the Path } 

См. Здесь, можно использовать полный этот способ рисования и прозрачной краски

http://polamreddyn.blogspot.in/2012/11/simple-free-hand-paint-with-color.html

и это

http://polamreddyn.blogspot.in/2012/10/free-hand-graw.html

На первый взгляд я вижу следующие проблемы:

Путем добавления пустого Path к paths как только вы это сделаете, у вас возникнет проблема, как только вы отмените отмену: сначала вы выходите на этот пустой Path , чтобы первая отмена не работала. Затем, если вы рисуете этот Path , он не добавляется к paths . Решение состоит в том, чтобы добавить завершенный Path к путям в touch_up() перед созданием нового.

То есть, удалите

 paths.add(mPath); 

От конструктора и в touch_up() , измените

 mPath = new Path(); paths.add(mPath); 

в

 paths.add(mPath); mPath = new Path(); 

Вы также захотите добавить

 canvas.drawPath(mPath, mPaint); 

После вашего цикла for в onDraw() , чтобы нарисовать onDraw() Path .

Вы не undonePaths когда пользователь снова начинает рисовать.

Если вы используете PorterDuffXfermode , сохраните представление в вашем bitmapBackup вместо предыдущего растрового изображения

 public void undo (){ bitmap.eraseColor(getDrawingCacheBackgroundColor()); mCanvas.drawBitmap(bitmapBackup, 0, 0, null); invalidate(); mPath.reset(); undofresh=true; } private void touch_start(float x, float y) { View v1 = this; v1.setDrawingCacheEnabled(true); this.bitmapBackup = Bitmap.createBitmap(v1.getDrawingCache()); v1.setDrawingCacheEnabled(false); } 
 use path.reset()in the MotionEvent.ACTION_DOWN event of OnTouchEvent() method. @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mPath.reset(); invalidate(); break; } return true; }