2016-01-29 14 views
5

Sto applicando un ColorFilter a un Drawable Volevo sapere se è possibile cambiare il colore di un disegnabile ma conservare l'ombra in esso.Applica ColorFilter ma conserva l'ombra trasparente nel file PNG

Qualcosa di simile a questo:

enter image description here

Dove se è stato applicato qualcosa di simile:

view.getBackground().setColorFilter(new PorterDuffColorFilter(itemView.getResources().getColor(R.color.green_500), PorterDuff.Mode.SRC_IN); 

Sarebbe applicare tale ColorFilter ma preservare i valori d'ombra e alfa.

Come posso ottenere questo risultato?

+0

uso 'PorterDuff .Mode.CLEAR' –

+1

Provalo ora. – AndyRoid

+1

Rende il mio drawable completamente trasparente – AndyRoid

risposta

1

Il modo giusto (e probabilmente solo) per ottenere ciò che si desidera è dividere il disegnabile in più livelli e utilizzare un layerDrawable per comporli. A quel punto puoi avere il livello di colore che puoi cambiare (e non avresti nemmeno bisogno di usare il duff di porter)

+0

Puoi fornire un esempio con il codice – AndyRoid

2

Penso che tu abbia bisogno di un hue shifter. In tal caso, utilizzando il ColorFilterGenerator proposto in Understanding the Use of ColorMatrix and ColorMatrixColorFilter to Modify a Drawable's Hue basta fare:

view.getBackground().setColorFilter(ColorFilterGenerator.adjustHue(180)); 

Il risultato è simile al seguente (tonalità ruotato di 180 gradi):

enter image description here

Nota: Tutto il merito per questa risposta deve andare a @Richard Lalancette per la sua risposta fantastica alla domanda che ho collegato

Aggiornamento dal comm ents:

Come è necessario specificare il colore di destinazione, è possibile calcolare i valori HSV di origine e di destinazione e utilizzare lo ColorFilterGenerator per spostare la tonalità. Ad esempio:

// Your source color (The RGB color from your original image is 255,85,78) 
float[] hsvSource = new float[3]; 
Color.RGBToHSV(255, 85, 78, hsvSource); 

// The color whose hue you want to achieve (green for example) 
float[] hsvTarget = new float[3]; 
Color.RGBToHSV(0, 200, 18, hsvTarget); 

view.getBackground().setColorFilter(ColorFilterGenerator.adjustHue(hsvTarget[0] - hsvSource[0])); 

Si noti che questo approccio prende in considerazione solo i valori di tonalità dei colori per spostarlo.

Aggiornamento dai commenti: risposta meravigliosa

@Jared di Rummler (Understanding the Use of ColorMatrix and ColorMatrixColorFilter to Modify a Drawable's Hue) prende la vostra drawable come parametro in modo non è necessario specificare il colore di origine:

view.getBackground().setColorFilter(ColorFilterGenerator.from(view.getBackground()).to(Color.GREEN)); 
+0

L'ho già usato in precedenza ma non riesco a impostare un colore specifico – AndyRoid

+0

@AndyRoid prova la mia risposta: http://stackoverflow.com/a/32703759/1048340 –

+0

@Jared La risposta di Rummler è brillante.Sto svalutando lo – antonio

Problemi correlati