2011-12-14 10 views
16

Estoy creando un degradado radial como:de la parte radial de diferentes 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> 

Pero en el campo gradientRadius utilizando valores como la SP y la inmersión devolverá un error. ¿Hay alguna forma de especificar el radio y la escala para mdpi y escalarlo automáticamente en el resto de densidades de pantalla, o es necesario crear múltiples archivos dibujables?

Respuesta

22

Entonces, ¿qué si usted hace esto:

res/estirable/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/valores-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> 

¿Qué opinas?

+0

Gracias, esto debe aceptarse como respuesta – Arnaud

+0

Sí, esto funciona como un encanto! Gracias !! – DevAndroid

0

El docs dice que puede especificar el atributo gradientRadius como un flotante (suponiendo que significará px) o como fracción.

Puede ser un valor fraccionario, que es un número de coma flotante con% o% p, como "14.5%". El% sufijo siempre significa un porcentaje del tamaño base; el sufijo% p opcional proporciona un tamaño relativo a algún contenedor principal.

¿Has probado eso? Eso permitiría especificar el tamaño en dp o cualquier unidad en el diseño, y consultar desde aquí. Sin embargo, es extraño que la mayoría de los tamaños se especifiquen como dimensiones en el formato xml dibujable.

+4

Bueno, traté con eso yo mismo y no pude hacerlo funcionar. Parecía que el porcentaje simplemente dividía lo que escribía con 100. Por lo tanto, el tamaño de base mencionado anteriormente era 1px. La notación% p hizo lo mismo, por lo que fue un error ...mi mal: | –

+0

fracción no está funcionando en Kitkat (API 19) e inferior ni 50% no 50% p, dibuja simplemente no se muestra –

-2

Usa los porcentajes, en el campo android: gradientRadius.

Ejemplo:

Para un conjunto radious 50% a 50,000% 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

Esto es simplemente incorrecto. Como dijo Tobias en el comentario de su propia respuesta,% y% p simplemente dividen el número proporcionado por 100. – Murkaeus

+0

, esto fue lo único que funcionó para mí. – Tamas

+0

% shoudl no "funciona para usted". ¿Has intentado esto en diferentes dispositivos de tamaños de pantalla? – Poutrathor

8

vieja pregunta, pero esta respuesta muestra altamente clasificado en Google y me creencia un enfoque alternativo es más escalable. En lugar de tener que suministrar la dimensión para cada densidad, crear una dimensión independiente de la densidad a partir de XML:

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

ya que no podemos aplicar este directamente a la radial dibujable XML gradiente, tenemos que aplicar a partir de código:

((GradientDrawable) someView.getBackground()) 
     .setGradientRadius(getResources().getDimension(
      R.dimen.yellowbadge_largeradius)); 

Esto anula el campo android:gradientRadius, por lo que puede dejarlo en 0. Sin embargo, aún no puede usar una dimensión% (basada en pantalla o de otro modo). Lo aplico al fondo de mi vista (¡al cual ya se ha establecido el dibujo del degradado!), Pero también se aplica al elemento src de ImageView, por supuesto.

Cuestiones relacionadas