Effacer bitmap pièces à l'aide de PorterDuff mode
J'essaie d'effacer des parties d'une image bitmap dans mon application Android en utilisant Porter-Duff Xfermodes.
J'ai un fond vert qui est superposé par un bleu bitmap. Quand je touche l'écran d'un "trou" dans la superposition bitmap est censé être créé en rendant le fond vert visible. Au lieu d'un trou mon code actuel produit un point noir.
Ci-dessous mon code. Toutes les idées, ce que je fais de mal ici?
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new DrawView(this));
}
public class DrawView extends View implements OnTouchListener {
private int x = 0;
private int y = 0;
Bitmap bitmap;
Canvas bitmapCanvas;
private final Paint paint = new Paint();
private final Paint eraserPaint = new Paint();
public DrawView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
//Set background
this.setBackgroundColor(Color.GREEN);
//Set bitmap
bitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.RGB_565);
bitmapCanvas = new Canvas();
bitmapCanvas.setBitmap(bitmap);
bitmapCanvas.drawColor(Color.BLUE);
//Set eraser paint properties
eraserPaint.setAlpha(0);
eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
eraserPaint.setAntiAlias(true);
}
@Override
public void onDraw(Canvas canvas) {
bitmapCanvas.drawColor(Color.BLUE);
bitmapCanvas.drawCircle(x, y, 10, eraserPaint);
canvas.drawBitmap(bitmap, 0, 0, paint);
}
public boolean onTouch(View view, MotionEvent event) {
x = (int) event.getX();
y = (int) event.getY();
invalidate();
return true;
}
}
OriginalL'auteur Philipp | 2010-08-12
Vous devez vous connecter pour publier un commentaire.
Première pensée, je ne suis pas sûr si le réglage de l'alpha à 0 sur votre effacer la peinture de l'objet est une bonne idée. Qui peut faire toute chose inefficace.
Aussi, vous devez toujours utiliser Bitmap.Config.ARGB_8888 si vous avez à traiter avec des alphas.
Si vous rencontrez des problèmes avec le PorterDuff choses, si, je vous suggère de simplifier votre démarche de ne faire que (temporairement). Qui vous aidera à affiner la partie qui ne fonctionne pas. Commentaire tout à voir avec le toucher et la vue des mises à jour.
Ensuite, vous pouvez sélectionner la partie du dessin qui ne fonctionne pas bien. Configurer votre constructeur comme suit:
Si vous définissez les choses comme ça, vous devriez être en mesure de dire comment votre PD méthode affecte le vert bitmap, et de changer les choses en conséquence.
1. Comme vous obtenez événements tactiles onTouch, utilisez drawPath de temps en temps pour dessiner un noir chemin d'accès à une image transparente. C'est votre gomme bitmap. Si vous n'êtes pas déjà le faire, les FingerPaint application de l'API de démos a quelques beaux exemples de code. 2. Dans onDraw, appliquer votre gomme à effacer, à l'image bitmap d'ORIGINE bleu bitmap avec le bon PorterDuff méthode. Cela permettra de réduire l'ensemble dans le bleu bitmap la forme de ce que vous avez effacé (le noir chemin) jusqu'à présent. 3. Toujours dans onDraw, mettre le vert bitmap à l'écran, suivi par le nouveau coupé bleu bitmap.
Remarque que ci-dessus pourrait être coûteux chaque tirage cycle de regarder dans les régions de découpage à la limite de la zone que vous faites une mise à jour uniquement à ce que l'utilisateur a changé dans la gomme bitmap.
Merci encore, Josh! Concernant limitées mises à jour d'écran et lisse les chemins, j'ai trouvé un assez bon tuto ici: corner.squareup.com/2010/07/smooth-signatures.html
Haha, ouais, que la section "Chirurgicalement Invalider" est exactement ce dont je parlais. C'est un bon tutoriel, trop!
OriginalL'auteur Josh
Voici code de travail... peut aider quelqu'un
bitmap = bm.copy(Config.ARGB_8888, true);
Merci, j'ai aussi trouvé cet article très utile. J'étais à la recherche de cette solution plus tôt l'année dernière.
Notez que si vous voulez juste tirer un trou dans l'image, il suffit de définir la couleur d'arrière-plan de Couleur.TRANSPARENT au lieu de la Couleur.VERT. J'ai eu beaucoup de temps à rassembler code de travail de tous les demi-exemples, merci beaucoup pour poster un exemple complet 🙂
OriginalL'auteur pawan
Voici un autre avancement de votre solution ... Voir Démo exemple
lire plus
OriginalL'auteur Daniel Nyamasyo