Android добавить функцию отмены в пример рисования пальцем в API демо - PullRequest
2 голосов
/ 03 октября 2011

Привет, я пытаюсь добавить функцию отмены в пример рисования пальцем, приведенный в демоверсии API.но я не могу этого достичь.До сих пор я добавил все пути, нарисованные в списке, и перерисовал его на холсте, кроме последнего пути.Но это не работает.Любая подсказка, где я иду не так.

Правка №1: Мой метод отмены такой:

private void undo(){            
        if (MyPathList.size()>0) {
            mCanvas.drawColor(0xFFFFFFFF);


            for (int i = 0; i < MyPathList.size()-1; i++) {
                Path p=(Path)MyPathList.get(i);             
                mCanvas.drawLine(0, 0, 20, 20, mPaint);
                mCanvas.drawLine(0, 0, 80, 20, mPaint);
                mCanvas.drawPath(p, mPaint);
                p.reset();              
            }               
            invalidate();
        }           
    }

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Возможно, этот урок вам нужен: http://www.tutorialforandroid.com/p/drawing-with-canvas-series.html

1 голос
/ 03 октября 2011

Когда вы рисуете линию для текущего процесса, как сейчас, используйте рисование как с помощью этого пальца, теперь сохраняйте эти точки в списке temp_array.Теперь добавьте этот список temp_array в основной список массивов, который будет рисовать все точки списка подмассива, как показано здесь.

List<List<Point> main_Points = new ArrayList<List<Point>>();
List<Point> temp_point; // this one is for the current drawing

как onTouch ()

onTouch(MotionEvent event){
     int x = (int) event.getX();
     int y = (int) event.getY();

     if(event.getAction==MotionEvent.DOWN){
           temp_point = new ArrayList<Point>();
           temp_point.add(new Point(x,y);
     }else if(event.getAction==MotionEvent.MOVE){
           if(temp_point!=null)
              temp_point.add(new Point(x,y);
     }else if(event.getAction==MotionEvent.UP){
           mainPoint.add(temp_point);
           temp_point = null;
     }
     return true;
}

всегда повторно инициализировать в onTouch() в событии down и получить всю точку во время перемещения, получить точку и сохранить в этом списке сейчас, во время события up сохранить этот список массива в основной список.

сейчас, если вы хотите отменить последнюю или болееВы можете просто удалить последний добавленный список temp_point из массива mainPoint List

0 голосов
/ 01 сентября 2015
There is another way of achieving undo , you can use porterduff mode.clear to draw over the particular path which need to be undone

  1.    Store your paths to  array of Paths during onTouch event. 

   2.   check the size of stored path array,  and get the last drawn path   using size() method. i.e patharray.size()-1;
  3.    Store that to a separate path. 
  4.    Call invalidate() method
  5.    Set your paint xfermode property to Mode.clear
  6.    Draw on canvas using the retrieved path and the newly set paint. 



    Public Path unDonePath,drawpath;
    Public Boolean undo=false;
    Paint paintForUndo= new Paint();
    Public ArrayList<Path>unDonePathArray= new ArrayList<Path>();
    Public ArrayList<Path>patharray= new ArrayList<Path>();
    public boolean onTouchEvent(MotionEvent event) 
    {
    Switch(MotionEven.getAction())
    {
    case MotionEvent.ACTION_UP:
    pathArray.add(drawpath);
    pathToDraw = new Path();
    //drawpath contains touchx and touch y co-ordinates.
    }
    }
   Protected void undo()
   {
   if(pathArray.size()>0) {
   unDonePath=new Path();
   unDonePathArray.add(pathArray.remove(pathArray.size()-1));
   unDonePath=unDonePathArray.get(unDonePathArray.size()-1);
   unDonePathArray.clear();
   invalidate();
   }
   }
   public void onDraw(Canvas canvas)
  {
  if(undo)
  {
   paintForUndo.setStrokeWidth(12.0f);
  /*stroke width have to be set more than or equal to your painted 
  stroke width, if ignored border of the  painted region will be left   
   uncleared. */
  paintForUndo.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.CLEAR));
  drawOnCanvas.drawPath(unDonePath,paintForUndo);
  }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...