web-dev-qa-db-fra.com

Imageview définir le filtre de couleur sur dégradé

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:

enter image description here

C'est ce que je veux:

enter image description here

Et voici ce que je reçois:

enter image description here

23
Malfunction

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: enter image description here

41
LaurentY