2011-10-03 3 views
2

salut j'essaye d'ajouter la fonction d'annulation à l'exemple de peinture de doigt donné dans la démonstration d'api. mais je ne suis pas capable de l'atteindre. Jusqu'à présent, j'ai ajouté tout le chemin qui est dessiné dans une liste et le redessiner sur le canevas sauf le dernier chemin. Mais ça ne fonctionne pas. Toute idée où je vais mal.Android ajouter une fonction d'annulation à l'exemple de peinture de doigt dans la démo d'api

Edit # 1: Ma méthode d'annulation est cette

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

Merci à l'avance.

Répondre

1

Lorsque vous ligne de dessin pour le processus en cours comme à utiliser maintenant le dessin comme utiliser un doigt maintenant cette pointe stocker dans temp_array liste. Maintenant, ajoutez cette liste de temp_array dans la liste de tableau principal qui va dessiner tout point de liste de sous-tableau comme sage ici.

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

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

toujours ré-initialiser en méthode OnTouch() en cas vers le bas et obtenir tout point au moment de déplacement obtenir le point et stocker dans cette liste maintenant jusqu'à l'événement stocker cette liste dans la liste principale.

maintenant si vous souhaitez annuler la dernière ou plus, vous pouvez simplement supprimer la dernière ajouter la liste des temp_point de la liste de tableau Mainpoint

+0

1+ pour la réponse ... et ça marche bien ... mais dans le cas d'un arc ... comment s'y prendre ... et lors de la collecte des points il ne retourne pas les points continus au lieu de trois points pour les longues lignes et deux points pour la ligne courte ... – Dinash

2

Peut-être que ce tutoriel est ce que vous cherchez: http://www.tutorialforandroid.com/p/drawing-with-canvas-series.html

+0

je l'ai déjà passé par cela et ils ont utilisé un certain modèle de conception là-bas. Ma question principale est pourquoi le code ci-dessus fonctionne ... et existe-t-il un autre moyen facile de s'y prendre? – Dinash

+0

Une fois que vous dessinez sur la toile, le tirage est collé directement sur la toile. Vous devez effacer la toile lorsque vous voulez une mise à jour, tout comme le tutoriel ci-dessus. Je pense comme un dessin animé de page-retournement. vous devez dessiner chaque page même image avec des différences mineures. Et sur Android ou d'autres langages de programmation, vous obtenez 1 page, et tout ce que vous pouvez faire est effacer le canevas et redessiner. Vous vous demandez peut-être ce que canvas.save et canvas.restore font. http://stackoverflow.com/questions/3051981/why-do-we-use-canvas-save-or-canvas-restore ici vous auriez l'idée. –

0
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); 
    } 
    } 
Questions connexes