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 .. P>
Capture d'écran du téléphone de Eraserpaint avait l'habitude d'écrire "Erik" sur blob fort> p> P> Sauvé PNG de la toile forte>
p> EraserPaint ressemble à ceci: strong> < / p> 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 .. p> 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. p> nouvelle note forte> Je jouais et découvre quelque chose d'autre c'est curieux. Expérimentant, j'ai essayé de passer du dessin à la page code> code> comme étant transmis à la méthode Qui crache p> Ondraw code> et directement sur la toile I configurée dans le contructeur appelé
mcanvas code> et remarqué qu'il n'a pas dessiné aussi loin que je pouvais voir .. donc j'ai ajouté un journal au
ondraw code> comme: p>
5 Réponses :
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;
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
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. P>
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(); } } }
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);
}
}
Cela ne peindra simplement pas de nouvelles formes, ne "enlever" pas les anciens
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); }
tu ferais mieux d'expliquer pourquoi il doit faire ça
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 ???