J'ai une image blanche que j'aimerais colorer avec un dégradé. Au lieu de générer un tas d'images chacune colorée avec un dégradé spécifique, je voudrais le faire en code (pas en xml).
Pour changer la couleur d'une image, j'utilise
imageView.setColorFilter(Color.GREEN);
Et cela fonctionne bien. Mais comment puis-je appliquer une couleur dégradée au lieu d'une couleur unie? LinearGradient
n'aide pas, car setColorFilter ne peut pas être appliqué aux objets Shader
.
[~ # ~] modifier [~ # ~] : Voici l'image que j'ai:
C'est ce que je veux:
Et voici ce que je reçois:
Vous devez obtenir Bitmap
de votre ImageView
et redessiner le même Bitmap
avec Shader
public void clickButton(View v){
Bitmap myBitmap = ((BitmapDrawable)myImageView.getDrawable()).getBitmap();
Bitmap newBitmap = addGradient(myBitmap);
myImageView.setImageDrawable(new BitmapDrawable(getResources(), newBitmap));
}
public Bitmap addGradient(Bitmap originalBitmap) {
int width = originalBitmap.getWidth();
int height = originalBitmap.getHeight();
Bitmap updatedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(updatedBitmap);
canvas.drawBitmap(originalBitmap, 0, 0, null);
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0, 0, 0, height, 0xFFF0D252, 0xFFF07305, Shader.TileMode.CLAMP);
Paint.setShader(shader);
Paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawRect(0, 0, width, height, Paint);
return updatedBitmap;
}
MISE À JOUR 3 J'ai changé: couleurs de dégradé, largeur LinearGradient = 0 et PorterDuffXfermode. Voici une bonne image pour comprendre PorterDuffXfermode: