android - Shape Drawable gradientRadius solo funciona en píxeles. ¿No es esto inútil? % de valores no funcionan
android-drawable (1)
Quiero usar la forma dibujable con un degradado radial como fondo para una Vista. De acuerdo con el javadoc, el radio del gradiente se puede establecer como un valor específico (presumiblemente píxeles) o como un porcentaje:
Android: gradientadio
Radio del gradiente, usado solo con gradiente radial.
Puede ser un valor de punto flotante, como "1.2".
Puede ser un valor fraccionario, que es un número de punto flotante añadido 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.
Corríjame si me equivoco, pero usar un valor de píxel aquí es completamente inútil ya que este gradiente se verá totalmente diferente de una densidad de pantalla a otra (probado, y sí, esto es cierto). Intenté ir con los valores% y% p, pero no funcionaron en absoluto.
Me sumergí en el código fuente de Android para ver cómo se procesaba gradientRadius y encontré esto en la clase GradientDrawable:
TypedValue tv = a.peekValue(
com.android.internal.R.styleable.GradientDrawableGradient_gradientRadius);
if (tv != null) {
boolean radiusRel = tv.type == TypedValue.TYPE_FRACTION;
st.mGradientRadius = radiusRel ?
tv.getFraction(1.0f, 1.0f) : tv.getFloat();
} else ...
}
Ah ha Así que agregar% o% p es dividir mi valor por 100. (Lo probé porque la documentación para TypeValue.getFraction () es aún más clara). El 65% se convirtió en 0.65. Tiene sentido, pero no sirve para ningún propósito útil.
Entonces, ¿cuál es la mejor manera de usar gradientRadius?
PD. He agregado mi fondo programáticamente usando un GradientDrawable y estoy obteniendo los resultados deseados. Utilicé GradientDrawable.setGradientRadius () con un valor relativo al ancho de vista y obtuve un gradiente consistente en todos los dispositivos.
Para trabajar con todo el tamaño de la pantalla tienes que establecer el radio en dp. Puedes calcular px desde dp por este método
public float pxfromDp(float dp) {
return dp * getResources().getDisplayMetrics().density;
}
Entonces, por ejemplo, desea establecer GradientDrawable.setGradientRadius(pxfromDp(7));