2010-03-31 6 views
2

J'ai un problème avec le code suivant:AvoidXferMode Tolérance

protected void onDraw(Canvas canvas) 
{ 
    Paint paint = new Paint(); 

    // Draw a blue circle 
    paint.setColor(Color.BLUE); 
    canvas.drawCircle(100, 100, 50, paint); 

    // Draw a red circle where it collides with the blue one 
    paint.setXfermode(new AvoidXfermode(Color.BLUE, 0, Mode.TARGET)); 
    paint.setColor(Color.RED); 
    canvas.drawCircle(50, 50, 50, paint); 
} 

Selon la documentation de l'API de AvoidXfermode la valeur de tolérance 0 signifie qu'il recherche une correspondance exacte des couleurs. Cela devrait fonctionner ici parce que je spécifie la même couleur que celle utilisée pour dessiner le premier cercle. Mais le résultat est que le cercle rouge n'est pas dessiné du tout. Quand j'utilise une valeur de tolérance de 255 à la place, ça marche (un cercle rouge est dessiné là où il entre en collision avec le bleu) mais ça sonne mal parce qu'avec une telle tolérance je pense qu'il devrait dessiner le cercle PARTOUT.

Alors qu'est-ce qui ne va pas ici? Documentation API Android? Moi?

Répondre

3

Votre profondeur de couleur de la toile est-elle RGB_565 ou ARGB_8888? J'ai testé cela sur les deux formats. Cela a fonctionné sur un canevas 32 bits, mais n'a pas fonctionné sur le canevas 16 bits. L'image 16 bits est probablement incapable d'afficher la couleur exacte que vous dessinez (0xFF0000FF), elle est donc légèrement modifiée (et imperceptiblement pour les yeux humains) lorsque vous dessinez le premier cercle bleu. Ensuite, lorsque vous effectuez l'éviter, en ciblant le bleu exact avec une tolérance de zéro, rien n'est affiché car ce vrai bleu n'est pas dans l'image.

Une tolérance de 255 fonctionne parce que cela permet d'éviter de faire correspondre la couleur "presque bleue", et le résultat sera un cercle qui est "presque rouge". Si vous utilisez une tolérance trop élevée, essayez des tolérances très faibles (à partir de 1 et en augmentant) jusqu'à ce que vous en trouviez une qui soit petite mais qui corresponde toujours au "presque bleu" que vous voulez remplacer.

La solution idéale serait de lire la valeur de couleur du cercle bleu après l'avoir dessinée, et de cibler cette couleur exacte. Ce serait possible si vous aviez le bitmap de la toile avec laquelle vous travaillez, et vous pouvez appeler bitmap.getPixel(). Cependant, je ne connais aucun moyen d'obtenir le bitmap d'un canevas si vous ne l'avez pas déjà (ce que vous n'avez pas dans la méthode onDraw).

+0

Merci. C'est tout. – kayahr

Questions connexes