android toile supprimer chemin dessiné
Je fais une application de dessin, et souhaite la mise en place d'une fonction annuler pour supprimer la précédente immédiate chemin tracé.
De codage:
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
}
Question:
Cependant, il semble qu'il n'y est pas bitmapCanvas.clearPath
cette méthode? Si alors comment pourrait-il être modifié?
Codes Modifié:
Déclarations:
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 méthode, va appeler lorsque les ci-dessous TouchedStart effectue
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 (i.e., 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));
}
Annuler: utilisateur en appuyant sur le bouton annuler utilisera ce
public void undo()
{
bitmap = bitmapBackup.copy(Bitmap.Config.ARGB_8888, true);
bitmapCanvas = new Canvas(bitmap);
}
Question de révision:
Une méthode firsttobackup()
est maintenant utilisé tel que bitmapBackup aurait set = bitmap lors de l'exécution de OnTouchEvent
touchStarted
. J'ai mis un toast en lui et il est sucesfully à être présenté "sauvegarde 123" lorsque l'utilisateur appuie sur l'écran et a commencé à dessiner.
Lorsque l'utilisateur clique sur le bouton annuler, il invoquera la undo
méthode, mais maintenant, en appuyant sur le bouton annuler, aucune action ne peut être vu...pourquoi?
Merci!!
- Il n'est pas clair, parce que la seule chose qui pénètre, est ce que vous dessinez. S'il vous plaît montrer onDraw.
- onDraw partie est ajoutée dans la question...merci!
Vous devez vous connecter pour publier un commentaire.
Je pense que la meilleure façon de le faire est d'avoir 2 images (1 sauvegarde supplémentaire bitmap pour la restauration à l'état précédent).
Vous avez besoin pour économiser de l'état antérieur d'un bitmap avant de commencer de nouveaux dessins.
Voici comment modifier votre code:
NullPointerException
. Avez-vous initialisé tout correctement? Mon code est juste un pseudo w/o bon routines d'initialisation. Je suppose que vous savez quoi faire avec elleC'est un vieux post, mais je cherchais une réponse à cette question ainsi. Je n'étais pas satisfait de la réponse choisie pour ce poste, et je l'ai trouvé moi-même après.
En fait, je pense que d'avoir une image bitmap en tant que sauvegarde n'est pas une grande mémoire-sage et limite le nombre d'étapes d'annulation que nous pouvons avoir.
Je crois que ce serait une meilleure solution :
D'avoir une pile de chemins dans votre classe
à côté de votre toile et votre pinceau (initialisation sauté) :
Alors chaque fois qu'une course est fini (sur la touche jusqu'à l'événement), ajouter un "clone" de la voie de l'historique d'annulation:
Et voici la fonction undo :
Les chemins sont beaucoup plus petits pour stocker dans la mémoire de bitmaps, afin que nous puissions avoir une bien plus grande de l'histoire.
path.reset()
est ce que je cherchais.voir ici peut-être utiliser ce un comment dessiner et effacer la peinture
http://polamreddyn.blogspot.in/2012/11/simple-free-hand-paint-with-color.html
et ce
http://polamreddyn.blogspot.in/2012/10/free-hand-graw.html
Au premier coup d'œil je vois les problèmes suivants:
Qui est, supprimer
à partir du constructeur, et dans
touch_up()
, changementà
Vous devrez également ajouter
après votre
for
boucle dansonDraw()
dans le but d'attirer l'en-coursPath
.Vous n'êtes pas vider
undonePaths
lorsque l'utilisateur commence à dessiner à nouveau.si vous utilisez
PorterDuffXfermode
, enregistrer la vue de votrebitmapBackup
,au lieu de précédente bitmap