studio programacion móviles libros desarrollo desarrollar curso collapsing aprende aplicaciones android gradient

móviles - manual de programacion android pdf



Gradiente circular en android (5)

Intento hacer un degradado que emita desde el medio de la pantalla en blanco, y se vuelva negro a medida que se mueve hacia los bordes de la pantalla.

Mientras hago un gradiente "normal" como este, he estado experimentando con diferentes formas:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#E9E9E9" android:endColor="#D4D4D4" android:angle="270"/> </shape>

Cuando usé la forma "oval" al menos obtuve una forma redonda, pero no hubo efecto de degradado. ¿Cómo puedo conseguir esto?''


Puedes obtener un degradado circular usando android:type="radial" :

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:type="radial" android:gradientRadius="250" android:startColor="#E9E9E9" android:endColor="#D4D4D4" /> </shape>


Siempre encuentro útiles las imágenes cuando aprendo un nuevo concepto, así que esta es una respuesta suplementaria.

El %p significa un porcentaje del elemento primario, es decir, un porcentaje de la dimensión más estrecha de cualquier vista en la que establezcamos nuestro dibujable. Las imágenes de arriba se generaron al cambiar el gradientRadius en este código

my_gradient_drawable

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:type="radial" android:gradientRadius="10%p" android:startColor="#f6ee19" android:endColor="#115ede" /> </shape>

Que se puede configurar en el atributo de background una vista como este

<View android:layout_width="200dp" android:layout_height="100dp" android:background="@drawable/my_gradient_drawable"/>

Centrar

Puedes cambiar el centro del radio con

android:centerX="0.2" android:centerY="0.7"

donde los decimales son fracciones del ancho y alto para y respectivamente.

Documentación

Aquí hay algunas notas de la documentation explican las cosas un poco más.

android:gradientRadius

Radio del gradiente, usado solo con gradiente radial. Puede ser una dimensión explícita o un valor fraccionario relativo a la dimensión mínima de la forma.

Puede ser un valor de coma flotante, como "1.2".

Puede ser un valor de dimensión, que es un número de coma flotante anexado a una unidad como "14.5sp". Las unidades disponibles son: px (píxeles), dp (píxeles independientes de la densidad), sp (píxeles escalados según el tamaño de fuente preferido), in (pulgadas) y mm (milímetros).

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.


Supongo que deberías agregar Android: centerColor

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#FFFFFF" android:centerColor="#000000" android:endColor="#FFFFFF" android:angle="0" /> </shape>

Este ejemplo muestra un gradiente horizontal de blanco a negro a blanco.


También puede hacerlo en código si necesita más control, por ejemplo, colores múltiples y posicionamiento. Aquí está mi fragmento de Kotlin para crear un degradado radial dibujable:

object ShaderUtils { private class RadialShaderFactory(private val colors: IntArray, val positionX: Float, val positionY: Float, val size: Float): ShapeDrawable.ShaderFactory() { override fun resize(width: Int, height: Int): Shader { return RadialGradient( width * positionX, height * positionY, minOf(width, height) * size, colors, null, Shader.TileMode.CLAMP) } } fun radialGradientBackground(vararg colors: Int, positionX: Float = 0.5f, positionY: Float = 0.5f, size: Float = 1.0f): PaintDrawable { val radialGradientBackground = PaintDrawable() radialGradientBackground.shape = RectShape() radialGradientBackground.shaderFactory = RadialShaderFactory(colors, positionX, positionY, size) return radialGradientBackground } }

Uso básico (pero no dude en ajustar con parámetros adicionales):

view.background = ShaderUtils.radialGradientBackground(Color.TRANSPARENT, BLACK)


<gradient android:centerColor="#c1c1c1" android:endColor="#4f4f4f" android:gradientRadius="400" android:startColor="#c1c1c1" android:type="radial" > </gradient>