2016-06-12 28 views
9

Ho un'immagine bianca che mi piacerebbe colorare con una sfumatura. Invece di generare un gruppo di immagini ciascuna colorata con un gradiente specifico, mi piacerebbe farlo in codice (non in xml).Imageview imposta il filtro colore sul gradiente

Per modificare il colore di un'immagine, io uso

imageView.setColorFilter(Color.GREEN); 

E questo funziona benissimo. Ma come posso applicare un colore sfumato invece di un colore solido? LinearGradient non aiuta, poiché setColorFilter non può essere applicato agli oggetti Shader.

EDIT: Questa è l'immagine che ho:

enter image description here

Questo è quello che voglio:

enter image description here

E questo è quello che sto ricevendo:

enter image description here

+0

Stai usando ImageView in XML per disegnare l'immagine in primo luogo? – SQLiteNoob

+0

@SQLiteNoob no, li sto creando dinamicamente nel codice. – Malfunction

risposta

12

Dovete ottenere Bitmap del vostro ImageView e ridisegnare stessa Bitmap con 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; 
} 

UPDATE 3 ho cambiato: i colori di pendenza, larghezza linearGradient = 0 e PorterDuffXfermode. Ecco una buona immagine per capire PorterDuffXfermode: enter image description here

+0

Come può essere usato con una visualizzazione di immagini? – Malfunction

+0

@Malfunction, mi spiace aggiornare la mia risposta – LaurentY

+0

@Malfunction Aggiorno la mia risposta e la collaudo – LaurentY

0

si potrebbe usare un selettore

main_header.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/. android" 
    android:layout_width="fill_parent" 
    android:layout_height="50dip" 
    android:orientation="horizontal" 
    android:background="@drawable/main_header_selector"> 
</LinearLayout> 

main_header_selector.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector  xmlns:android="http://schemas.android.com/apk/res/.  android"> 
<item> 
    <shape> 
     <gradient 
     android:angle="90" 
     android:startColor="#FFFF0000" 
     android:endColor="#FF00FF00" 
     android:type="linear" /> 
    </shape> 
</item> 
</selector> 

Lo stesso sfondo può essere applicato a un ImageView.

di definire e selettore di utilizzo in modo dinamico, fare riferimento a questo link: Dynamically defining and using selectors

+0

Questo è però per applicare uno sfondo. Ho bisogno di qualcosa che cambi l'immagine stessa. – Malfunction

0

Creare un file XML, e posizionarlo nella cartella drawable.

gradient.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle"> 
<gradient 
    android:startColor="#CCb1e7fa" 
    android:centerColor="#B3ffffff" 
    android:endColor="#CCb1e7fa" 
    android:angle="180" /> 
<corners android:radius="5dp" /> 

</shape> 

Successivamente aggiungere questo come sfondo per la visualizzazione di immagini

<ImageView 
      android:id="@+id/umageview1" 
      android:layout_width="100dp" 
      android:layout_height="100dp" 
      android:background="@drawable/gradient" 
      android:layout_centerHorizontal="true" 
      />