8
votes

Essayer de créer une peinture à effacer pour la toile

Je crée une application de dessin qui utilise la classe DessinSurFaceView ci-dessous. Dans cette classe, j'ai une peinture appelée EraserPaint que l'utilisateur peut basculer et éteindre. Lorsque sur cette peinture est supposée à goaser, ce qui est dans son chemin. mais au lieu de cela, il suffit de dessiner une ligne noire ..

Lorsque j'écrangeais la toile comme un png transparent, la gomme est correcte mais à l'écran, il affiche le noir ..

Capture d'écran du téléphone de Eraserpaint avait l'habitude d'écrire "Erik" sur blob

Entrez la description de l'image ici

Sauvé PNG de la toile Entrez la description de l'image ici

EraserPaint ressemble à ceci: < / p> xxx

la classe entière xxx

Je dois ajouter que j'ajoute que j'ajoute cette vue personnalisée à une disposition relative qui a ce motif damier comme image d'arrière-plan ..

S'il vous plaît aider s'il vous plaît. J'ai besoin de cette image de prévisualisation pour ne pas afficher le noir après que la peinture de gomme ait été utilisée. J'en ai besoin pour montrer le motif damier derrière .. Je sais que la gomme fonctionne comme ces marques de gomme noirs économisent comme transparente.

nouvelle note

Je jouais et découvre quelque chose d'autre c'est curieux. Expérimentant, j'ai essayé de passer du dessin à la page comme étant transmis à la méthode Ondraw et directement sur la toile I configurée dans le contructeur appelé mcanvas et remarqué qu'il n'a pas dessiné aussi loin que je pouvais voir .. donc j'ai ajouté un journal au ondraw comme: xxx

Qui crache xxx


6 commentaires

Apparemment, la couleur noire que vous avez vue pourrait être l'AVC, Cuz, c'est trop élevé, peut-être que vous devriez essayer de le supprimer ou vous pouvez définir la couleur du coup avec cela aussi. Eraserpaint.setargb (0, 0, 0, 0);


Peu importe ce que je fais à la taille de l'accident vasculaire cérébral ou à la couleur .. mêmes résultats .. Je crois que ce qui se passe est que cela fonctionne bien pour une raison quelconque la gomme coupe tout à travers tout et est noir .. ne peut pas le réparer!


Hımm, essayé de changer de style de peinture? Changez-le pour remplir plutôt que cérébral?


Ouais! Je suis tellement confus!


Désolé de commenter un tel ancien mais avez-vous trouvé un moyen?


Comment la mettre en œuvre ???


5 Réponses :


7
votes

J'ai eu le même problème avec mon application. J'ai même essayé le code d'exemple "peinture à doigts" et j'ai toujours eu le même problème. Je n'ai jamais été capable d'avoir le travail de gomme comme un chemin, mais j'ai pu trouver une solution de contournement. Plutôt que de dessiner un chemin lorsque je m'efface, je dessine un cercle (il pourrait s'agir d'une forme) lorsque l'utilisateur met son doigt ou il y a un événement "Déplacer":

case MotionEvent.ACTION_DOWN:
mPaint.setStrokeWidth(25);
            mPaint.setXfermode(new PorterDuffXfermode(
                    PorterDuff.Mode.CLEAR));
            mCanvas.drawCircle(x, y, 10, mPaint);
            isErase = true;
            invalidate();
        }
        touch_start(x, y);
        invalidate();
        break;
case MotionEvent.ACTION_MOVE:   
        if(isErase)
        {
            mCanvas.drawCircle(x, y, 20, mPaint);
        }
        else{
            touch_move(x, y);
        }invalidate();
        break;


3 commentaires

Je vais donner cela un coup .. Avez-vous vu la note que je viens d'ajouter ci-dessus? Avez-vous une idée des raisons pour lesquelles la toile est transmise à ONDRAW est différente de celle de Mcanvas?


Essayé .. et même résultat


Sa peinture noire seulement



0
votes

Ceci est juste une supposition: cela pourrait être lié à l'accélération matérielle. Essayez de désactiver l'accélération matérielle. Si cela vous aide, vous pouvez créer un bitmap de la taille de la vue, dessiner toutes vos affaires à ce bitmap, puis dessinez le bitmap dans la toile de la vue.


0 commentaires

1
votes

Même problème rencontré, a essayé toutes les autres solutions trouvées, pas de chance.

Mais j'ai eu une solution de contournement. Vous pouvez ajouter un bitmap pour stocker les traits. P>

    @Override
protected void onDraw(Canvas canvas) {
    // Log.i(TAG,"onDraw called");
    synchronized (strokes) {
        if (strokes.size() > 0) {
            for (Stroke s : strokes) {
                cacheCanvas.drawPath(s.path, s.color);
            }
            canvas.drawBitmap(foreground, 0, 0, null);
            strokes.clear();
        }
    }
}


0 commentaires

-2
votes

Vous pouvez utiliser une variable booléenne lors du choix de gomme (c'est-à-dire iseraser = true code>) et dans ondraw () code>, vous pouvez dessiner le chemin si ce n'est pas gomme.

@Override
protected void onDraw(Canvas canvas) {
  if(!isEraser ){
   canvas.drawPath(mPath, mPaint);
  }
}


1 commentaires

Cela ne peindra simplement pas de nouvelles formes, ne "enlever" pas les anciens



0
votes

Pour que la toile soit effacée et invalider, vous devez définir le Setxfermode de votre toile sur NULL. Vérifiez la dernière ligne du code.

if(view.getId()==R.id.erase_btn) {

        erase_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onDraw.setErase(true);
            }
        }
}

public void setErase(boolean isErase){
    erase=isErase;
    if(erase) drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    else drawPaint.setXfermode(null);
}


1 commentaires

tu ferais mieux d'expliquer pourquoi il doit faire ça