2016-02-25 10 views
14

Con il nuovo aggiornamento del supporto Android, i drawable vettoriali diventano compatibili con le versioni precedenti. Ho un'immagine vettoriale con vari percorsi. Voglio che il colore dei percorsi cambi al clic di un pulsante o programmaticamente in base a un valore di input. È possibile accedere al parametro name del percorso vettoriale? E poi cambia il colore.Come cambiare il colore del tracciabile vettoriale al clic del pulsante

+1

è possibile colorare l'intero vettore, ma non singoli componenti del percorso – Blackbelt

risposta

1

Consente di cambiare un colore percorso nel vettore drawable

VectorChildFinder vector = new VectorChildFinder(this, R.drawable.my_vector, imageView); 

VectorDrawableCompat.VFullPath path1 = vector.findPathByName("path1"); 
path1.setFillColor(Color.RED); 

Library è qui: https://github.com/devsideal/VectorChildFinder

31

Il colore dell'intero vettore può essere modificato utilizzando setTint.

si deve impostare l'ImageView nel file di layout come questo:

<ImageView 
    android:id="@+id/myImageView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:tint="@color/my_nice_color" 
    android:src="@drawable/ic_my_drawable" 
    android:scaleType="fitCenter" /> 

Poi per cambiare il colore della vostra immagine:

DrawableCompat.setTint(myImageView.getDrawable(), ContextCompat.getColor(context, R.color.another_nice_color)); 

Nota: myImageView.getDrawable() dà NullPointerException se drawable vettore è impostato su imageView come sfondo.

+2

Questa imposta tinta a tutta drawable ma non un percorso specifico del vettore disegnabile. – suku

+1

'android: tint' deve essere impostato dopo aver impostato' android: src' – rupinderjeet

+1

Incredibile! grazie. – tinyCoder

0

Come affermato da @Eyal in questo post https://stackoverflow.com/a/32007436/4969047

È non può cambiamento del colore del percorso individuale in fase di esecuzione. Guardando il codice sorgente di VectorDrawableCompat, l'unico metodo per esporre l'elemento interno per nome è getTargetByName che è presente nella classe privata privata VectorDrawableCompatState di VectorDrawableCompat.

Poiché è un pacchetto privato (predefinito) - non è possibile utilizzarlo (a meno che non si usi reflection).

+1

@Shubral, puoi approfondire con il codice su come la riflessione può essere utilizzata per raggiungere questo obiettivo? Potrebbe richiedere del tempo, ma potrebbe aiutare un sacco di persone. – suku

4

È possibile utilizzare questo metodo per cambiare colore in API inferiore a cambiare colore vettore nel frammento

int myVectorColor = ContextCompat.getColor(getActivity(), R.color.colorBlack); 
        myButton.getIcon().setColorFilter(myVectorColor, PorterDuff.Mode.SRC_IN); 

al posto di getActivity si dovrebbe usare MainActivity.this per cambiare vettore colore nell'attività

1

È può cambiare il colore del singolo percorso in fase di esecuzione, senza utilizzare il riflesso.

VectorMaster introduce il controllo dinamico sui drawable vettoriali. Ogni aspetto di un vettore disegnabile può essere controllato dinamicamente (tramite istanze Java), utilizzando questa libreria.

Basta aggiungere il seguente dipendenza nel build.gradle della tua applicazione

dependencies { 
    compile 'com.sdsmdg.harjot:vectormaster:1.0.9' 
} 

Nel tuo caso avete bisogno di un semplice cambiamento di colore: ad esempio

Vettore: your_vector.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24.0" 
    android:viewportHeight="24.0"> 
<path 
    android:name="outline" 
    android:pathData="M20.84,4..." 
    android:strokeColor="#5D5D5D" 
    android:fillColor="#00000000" 
    android:strokeWidth="2"/> 

XML:

<com.sdsmdg.harjot.vectormaster.VectorMasterView 
    android:id="@+id/your_vector" 
    android:layout_width="150dp" 
    android:layout_height="150dp" 
    app:vector_src="@drawable/your_drawable" /> 

Java:

VectorMasterView heartVector = (VectorMasterView) 
findViewById(R.id.your_drawable); 

// find the correct path using name 
PathModel outline = heartVector.getPathModelByName("outline"); 

// set the stroke color 
outline.setStrokeColor(Color.parseColor("#ED4337")); 

// set the fill color (if fill color is not set or is TRANSPARENT, then no fill is drawn) 
outline.setFillColor(Color.parseColor("#ED4337")); 

Da: https://github.com/harjot-oberai/VectorMaster, sotto licenza MIT.

Ora hai il pieno controllo sui drawable vettoriali.

0

Ci sono diversi modi di fare le stesse cose, ma questo funziona per entrambe le Vector drawable nonché SVG (Locale/Rete).

imageView.setColorFilter(ContextCompat.getColor(context, 
R.color.headPink), android.graphics.PorterDuff.Mode.SRC_IN); 

(cambia R.color.headPink con il colore della vostra scelta)

Problemi correlati