2011-12-14 16 views
16

sto creando un gradiente radiale come:gradiente radiale per differenti dpi

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
<gradient 
     android:startColor="#7faacaFF" 
     android:endColor="#cfe1edFF" 
     android:gradientRadius="326" 
     android:type="radial"/> 
</shape> 

Ma nel campo gradientRadius utilizzando valori come sp e dip restituire un errore. C'è un modo per specificare il raggio e la scala per mdpi e ridimensionarlo automaticamente nel resto della densità dello schermo, o è necessario creare più file disegnabili?

risposta

22

Così che cosa se si esegue questa operazione:

res/drawable/foo.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
           android:shape="rectangle"> 
<gradient 
     android:startColor="#7faacaFF" 
     android:endColor="#cfe1edFF" 
     android:gradientRadius="@dimen/radius" 
     android:type="radial"/> 
</shape> 

res/valori-MDPI/dimens.xml

<resources ...> 
... 
<item name="radius" format="float" type="dimen">326</item> 
.... 

</resources> 

res/values-hdpi/dimens.xml

<resources ...> 
... 
<item name="radius" format="float" type="dimen">200.34</item> 
.... 

</resources> 

Cosa ne pensi?

+0

Grande grazie, questo dovrebbe essere accettato come risposta – Arnaud

+0

Sì, questo funziona come un fascino !! Grazie !! – DevAndroid

0

Il docs dice che è possibile specificare l'attributo gradientRadius come float (supponendo che significherebbe px) o come frazione.

Può essere un valore frazionario, che è un numero in virgola mobile aggiunto con% o% p, ad esempio "14,5%". Il suffisso% indica sempre una percentuale della dimensione base; il suffisso opzionale% p fornisce una dimensione relativa ad un contenitore genitore.

Hai provato? Ciò renderebbe possibile specificare la dimensione in dp o qualsiasi unità nel layout e fare riferimento ad essa da qui. È strano però, la maggior parte delle dimensioni sono specificate come dimensioni nel formato xml estraibile.

+4

Beh, ci ho provato e non ho potuto farlo funzionare. Sembrava che la percentuale dividesse solo quello che ho scritto con 100. Quindi la dimensione di base di cui sopra era 1px. La notazione% p ha fatto lo stesso, quindi è stato un errore ...il mio cattivo: | La frazione –

+0

non funziona su Kitkat (API 19) e inferiore né 50% non 50% p, disegnabile appena non visualizzata –

-2

Usa le percentuali, nel campo android: gradientRadius.

Esempio:

Per una serie radious 50% al 50000% p

<gradient 
       android:angle="45" 
       android:centerX="0.5" 
       android:centerY="0.5" 
       android:endColor="#123123" 
       android:gradientRadius="50000%p" 
       android:startColor="#456456" 
       android:type="radial" /> 
+0

Questo è semplicemente errato. Come ha affermato Tobias nel commento della sua risposta,% e% p dividono semplicemente il numero fornito da 100. – Murkaeus

+0

ancora, questa era l'unica cosa che ha funzionato per me. – Tamas

+0

% shoudl non "funziona per te". hai provato questo su diversi dispositivi di dimensioni dello schermo? – Poutrathor

8

vecchia questione, ma questa risposta mostra altamente classificato in Google e ho convinzione un approccio alternativo è più scalabile. Invece di dover fornire la dimensione per ogni densità, creare una dimensione densità indipendente da XML:

<dimen name="gradient_radius">25dp</dimen> 

Poiché non possiamo applicare questa direttamente alla radiale drawable gradiente XML, dobbiamo applicare in dalle codice:

Questo sostituisce il campo android:gradientRadius, quindi è possibile lasciarlo a 0. Non è ancora possibile utilizzare una dimensione% (basata sullo schermo o altrimenti). Lo applico allo sfondo della mia vista (a cui il gradiente disegnabile è già impostato!) Ma si applica anche all'elemento src di ImageView, naturalmente.