Je suis tombé sur Sweep Gradient sur Android et j'étais intrigué s'il pouvait me donner un meilleur contrôle sur l'espacement des couleurs et les transitions. A fait une recherche rapide et n'a presque rien trouvé à ce sujet !!
Les seules quelques références que j'ai trouvées (et elles ne répondent pas aux critères de se rapprocher même de l'expliquer correctement ou de manière exhaustive) sont répertoriées ci-dessous:
C'est donc presque à ce sujet. D'autres sont similaires ou d'une manière désobligeante.
Peu de conclusions que j'ai tirées jusqu'à présent (et peut-être que je me trompe):
Je connais des gens mai considère que ce n'est pas vraiment une question technique. Mais pour que je travaille avec des dégradés de balayage ou que je sache au moins ce qu'ils signifient, la description doit venir de quelque part. Et veuillez fournir les réponses avec quelques exemples d'utilisation du balayage dans des cas autres que les anneaux.
Le dégradé Word dans ce contexte (comme dans de nombreux éditeurs graphiques, y compris Photoshop) fait référence à une transition fluide entre plusieurs couleurs , par opposition à l'utilisation d'une seule couleur pour remplir une zone.
L'API Android Android propose 3 dégradés différents: LinearGradient
, RadialGradient
et SweepGradient
.
Ce sont toutes des sous-classes de Shader
. Vous pouvez définir un Shader
sur un objet Paint
, puis dessiner n'importe quelle forme avec ce Paint
. La forme sera remplie de couleurs et de transitions entre elles, selon le type de dégradé.
Par exemple:
Cette image peut être produite avec ce code:
Bitmap test = Bitmap.createBitmap(640, 200, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(test);
{ // draw a dark gray background
Paint backgroundPaint = new Paint();
backgroundPaint.setARGB(255, 24, 24, 24);
c.drawPaint(backgroundPaint);
}
Path heart = new Path();
{ // prepare a heart shape
heart.moveTo(110, 175);
heart.lineTo(10, 75);
RectF leftCircle = new RectF(10, 25, 110, 125);
heart.arcTo(leftCircle, 180, 180);
RectF rightCircle = new RectF(110, 25, 210, 125);
heart.arcTo(rightCircle, 180, 180);
heart.close();
}
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Paint.setTextSize(18f);
int[] colors = {
0xFFFFFF88, // yellow
0xFF0088FF, // blue
0xFF000000, // black
0xFFFFFF88 // yellow
};
float[] positions = {0.0f, 0.33f, 0.66f, 1.0f};
{ // draw the left heart
SweepGradient sweepGradient;
{ // initialize the sweep gradient
sweepGradient = new SweepGradient(50, 50, colors, positions);
Paint.setShader(sweepGradient);
}
c.drawPath(heart, Paint);
c.drawText("SweepGradient", 50, 190, Paint);
}
{ // draw the middle heart
LinearGradient linearGradient;
{ // initialize a linear gradient
linearGradient = new LinearGradient(250, 0, 350, 150, colors, positions, Shader.TileMode.CLAMP);
Paint.setShader(linearGradient);
}
heart.offset(210, 0); // move the heart shape to the middle
c.drawPath(heart, Paint);
c.drawText("LinearGradient", 260, 190, Paint);
}
{ // draw the right heart
RadialGradient radialGradient;
{ // initialize a linear gradient
radialGradient = new RadialGradient(550, 50, 100, colors, positions, Shader.TileMode.CLAMP);
Paint.setShader(radialGradient);
}
heart.offset(210, 0); // move the heart shape to the right
c.drawPath(heart, Paint);
c.drawText("RadialGradient", 470, 190, Paint);
}
{ // save the bitmap
String filename = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.png";
FileOutputStream out = null;
try {
out = new FileOutputStream(filename);
test.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
} finally {
try {
out.close();
} catch (Exception e) {
}
}
}
Ainsi, le LinearGradient
est Linear Gradient
dans Photoshop, RadialGradient
est Radial Gradient
et SweepGradient
est Angular Gradient
, comme décrit dans votre 3ème référence. Je recommande d'abord de les essayer dans un éditeur d'images (tous les éditeurs d'images populaires ont ces outils), et vous aurez rapidement une idée de leur fonctionnement.
Vous pouvez également utiliser ces dégradés dans un dessinable XML (comme dans votre 4ème référence), avec une limitation d'utilisation de 3 couleurs maximum.
Dans un SweepGradient
, lorsque vous fournissez des positions, le point 0,0 est à 3 heures, dans le sens horaire (avec 0,25 à 6 heures, 0,5 à 9 heures, 0,75 à 12 heures et 1.0 de retour à 3 heures).
À propos de vos conclusions:
SweepGradient
, pas seulement un anneau. Même les étiquettes sont dessinées avec les dégradés de l'exemple ci-dessus.SweepGradient
est très similaire à LinearGradient
, sauf que vous n'avez pas besoin de fournir un TileMode
, car vous ne pouvez pas exécuter en dehors des limites de votre liste de couleurs.J'espère que cela clarifie les choses.
Pour xml dessinable cela peut être spécifié avec
Android:type="sweep"
Android: tapez peut avoir des valeurs(sensible aux majuscules et minuscules): linear
, radial
ou sweep