Comment peindre avec alpha?
Je veux peindre des graphiques sur une Toile, tels que les couleurs sont additifs. Par exemple, je veux produire ceci:
Mais au lieu de cela, je reçois ceci:
Noter que la moitié blanc, moitié noir, le fond est intentionnelle, juste pour voir comment alpha interagit avec les deux milieux. Je serai heureux d'avoir la possibilité de travailler avec des arrière-plan. Voici mon code:
public class VennColorsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
class VennView extends View {
public VennView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int alpha = 60, val = 255;
int ar = Color.argb(alpha, val, 0, 0);
int ag = Color.argb(alpha, 0, val, 0);
int ab = Color.argb(alpha, 0, 0, val);
float w = canvas.getWidth();
float h = canvas.getHeight();
float cx = w / 2f;
float cy = h / 2;
float r = w / 5;
float tx = (float) (r * Math.cos(30 * Math.PI / 180));
float ty = (float) (r * Math.sin(30 * Math.PI / 180));
float expand = 1.5f;
Paint paint = new Paint();
paint.setColor(Color.WHITE);
canvas.drawRect(new Rect(0, 0, (int) w, (int) (h / 2)), paint);
PorterDuff.Mode mode = android.graphics.PorterDuff.Mode.ADD;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColorFilter(new PorterDuffColorFilter(ar, mode));
paint.setColor(ar);
canvas.drawCircle(cx, cy - r, expand * r, paint);
paint.setColorFilter(new PorterDuffColorFilter(ag, mode));
paint.setColor(ag);
canvas.drawCircle(cx - tx, cy + ty, expand * r, paint);
paint.setColorFilter(new PorterDuffColorFilter(ab, mode));
paint.setColor(ab);
canvas.drawCircle(cx + tx, cy + ty, expand * r, paint);
}
}
this.setContentView(new VennView(this));
}
}
Quelqu'un peut s'il vous plaît aidez-moi à comprendre comment peindre avec des couleurs additives dans Android graphiques?
source d'informationauteur Melinda Green
Vous devez vous connecter pour publier un commentaire.
Vous êtes sur la bonne voie. Il existe 3 principaux problèmes dans votre code:
Voici ce que j'ai obtenu en utilisant xfer mode. Ce que je fais est le dessin tout en image temporaire et puis le rendu image entière à main en toile.
Vous demandez pourquoi avez-vous besoin de temp bitmap? Bonne question! Si vous êtes à dessiner tout ce que sur une grande toile, les couleurs seront mélangés avec les principaux toile couleur d'arrière-plan, de sorte que toutes les couleurs vont se faire massacrer. Transparent temp bitmap permet de garder vos couleurs à l'écart des autres parties de l'INTERFACE utilisateur
Assurez-vous de ne pas accorder quoi que ce soit dans
onDraw()
- vous serez à court de mémoire très bientôt dans cette voie.. assurez-vous Aussi d'avoir recyclé temp d'image lorsque vous n'en avez plus besoin.Merci encore Pavel. Cela aurait été très difficile pour moi d'avoir trouvé sur mon propre. Je réponds à ma propre question pour mieux percer dans les détails, mais j'ai accepté la vôtre comme la meilleure réponse.
Vous avez raison, je préfère ne pas avoir à créer et gérer une image Bitmap hors écran (et de la Toile). C'est essentiellement pourquoi je l'ai mentionné qu'un fond noir ou blanc serait parfait pour faire ce travail.
Je ne suis jamais concerné par les performances avant de voir quelque chose de travail, mais je partage votre attention, après ce point. Le montage de votre version de le corriger et de supprimer ceux de ses membres qui donne la mise en œuvre ci-dessous.
Est ce solide? Notez les deux appels à la Toile.drawColor() ce qui je pense pourrait également être combinés en un seul.