Функция отмены приложения Android (мультитач)

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

Объявления:

 int thelastLineId=0; 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, Path> reservedpathMap; // for saving the paths being undone private HashMap<Integer, Point> previousPointMap; // current Points 

Конструктор:

 pathMap = new HashMap<Integer, Path>(); reservedpathMap = new HashMap <Integer,Path>(); // for storing path being undone previousPointMap = new HashMap<Integer, Point>(); 

OnDraw:

  @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(bitmap, 0, 0, paintScreen); // for each path currently being drawn for (Integer key : pathMap.keySet()) canvas.drawPath(pathMap.get(key), paintLine); // draw line } 

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) { touchStarted(event.getX(actionIndex), event.getY(actionIndex), event.getPointerId(actionIndex)); } else if (action == MotionEvent.ACTION_UP) { touchEnded(event.getPointerId(actionIndex)); } else { touchMoved(event); } invalidate(); return true; } 

touchStarted:

  private void touchStarted(float x, float y, int lineID) // lineID represents how many fingers, 1 finger 1 line { Path path; // used to store the path for the given touch id Point point; // used to store the last point in path // if there is already a path for lineID if (pathMap.containsKey(lineID)) { path = pathMap.get(lineID); // get the Path path.reset(); // reset the Path because a new touch has started point = previousPointMap.get(lineID); // get Path's last point } else { path = new Path(); // create a new Path pathMap.put(lineID, path); // add the Path to Map point = new Point(); // create a new Point previousPointMap.put(lineID, point); // add the Point to the Map } path.moveTo(x, y); point.x = (int) x; point.y = (int) y; } 

touchMoved:

  private void touchMoved(MotionEvent event) { // for each of the pointers in the given MotionEvent for (int i = 0; i < event.getPointerCount(); i++) { // get the pointer ID and pointer index int pointerID = event.getPointerId(i); int pointerIndex = event.findPointerIndex(pointerID); // if there is a path associated with the pointer if (pathMap.containsKey(pointerID)) { float newX = event.getX(pointerIndex); float newY = event.getY(pointerIndex); // get the Path and previous Point associated with this pointer Path path = pathMap.get(pointerID); Point point = previousPointMap.get(pointerID); float deltaX = Math.abs(newX - point.x); float deltaY = Math.abs(newY - point.y); if (deltaX >= TOUCH_TOLERANCE || deltaY >= TOUCH_TOLERANCE) { path.quadTo(point.x, point.y, ((newX + point.x)/2),((newY + point.y)/2)); point.x = (int) newX ; point.y = (int) newY ; } } } 

touchEnded:

  private void touchEnded(int lineID) { Path path = pathMap.get(lineID); // get the corresponding Path bitmapCanvas.drawPath(path, paintLine); path.reset(); } 

UNDO:

  public void undo() { Toast.makeText(getContext(), "undo button pressed" + thelastLineId, Toast.LENGTH_SHORT).show(); Path path = pathMap.get(thelastLineId); reservedpathMap.put(thelastLineId, path); // add the Path to reservedpathMap for later redo pathMap.remove(thelastLineId); invalidate(); } 

Вопрос:

Я пытаюсь реализовать метод UNDO, используя код, как показано выше: попытка удалить ключ thelastLindId из thelastLindId пути HashMappathmap в HashMap reservedpathMap для последующего повтора), так что если invalidate() будет вызывать OnDraw() и Перерисовывать

 for (Integer key : pathMap.keySet()) canvas.drawPath(pathMap.get(key), paintLine); 

Тем не менее, нажатие кнопки отмены может инициировать тост «отмена клика», но последняя обратная линия не исчезает.

Кто-нибудь, пожалуйста, дайте мне ключ к Undo () и Redo ()? Спасибо заранее!!

Поскольку я могу понять, чего вы хотите достичь, вы хотите иметь возможность рисовать линии на холсте и после этого делать функциональность UNDO для вашего проекта. Прежде всего, я думаю, что момент, когда вы добавляете путь к вашему массиву, должен быть, когда пользователь поднимет свой палец в методе touchEnded . Во-вторых, я действительно не понимаю то, что вы объясняете о двух / трех пальцах? Вы поддерживаете мультитач в своем холсте? Вот реализация, которую я использовал в предыдущем примере для рисования на холсте с отменой реализации. Надеюсь, это поможет вам сделать вещи более ясными:

 public void onClickUndo () { if (paths.size()>0) { undonePaths.add(paths.remove(paths.size()-1)) invalidate(); } else //toast the user } public void onClickRedo (){ if (undonePaths.size()>0) { paths.add(undonePaths.remove(undonePaths.size()-1)) invalidate(); } else //toast the user } 

И вот ваши методы прикосновения:

 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { for (Path p : paths){ canvas.drawPath(p, mPaint); } } private float mX, mY; private static final float TOUCH_TOLERANCE = 0; private void touch_start(float x, float y) { mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; } private void touch_move(float x, float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); mX = x; mY = y; } } private void touch_up() { mPath.lineTo(mX, mY); // commit the path to our offscreen mCanvas.drawPath(mPath, mPaint); // kill this so we don't double draw mPath = new Path(); paths.add(mPath); } 

Как вы можете видеть здесь, пути – это аррайалист, где я храню свои пути. Если вы скажете мне, почему вам нужно вводить свои пути в hashmap, возможно, я могу быть более полезным.