Me gustaría crear una forma similar a la siguiente imagen:
Observe los gradientes de la mitad superior del color 1 al color 2, pero hay una mitad inferior que se gradúa del color 3 al color 4. Sé cómo hacer una forma con un solo degradado, pero no estoy seguro de cómo dividir una forma en dos mitades y forma 1 forma con 2 gradientes diferentes.
¿Algunas ideas?
Respuestas:
No creo que pueda hacer esto en XML (al menos no en Android), pero he encontrado una buena solución publicada aquí que parece que sería de gran ayuda.
Básicamente, la matriz int le permite seleccionar múltiples paradas de color, y la siguiente matriz flotante define dónde se ubican esas paradas (de 0 a 1). Luego, como se indicó, puede usar esto como un Drawable estándar.
Editar: así es como podría usar esto en su escenario. Digamos que tiene un botón definido en XML así:
Luego pondrías algo como esto en tu método onCreate ():
No puedo probar esto en este momento, este es el código de mi cabeza, pero básicamente solo reemplazo o agrego paradas para los colores que necesita. Básicamente, en mi ejemplo, comenzaría con un verde claro, se desvanecería a blanco ligeramente antes del centro (para dar una transición más desvanecida, en lugar de una dura), se desvanecería de blanco a verde medio entre 45% y 55%, luego se desvanecería de verde medio a verde oscuro desde 55% hasta el final. Es posible que esto no se vea exactamente como su forma (en este momento, no tengo forma de probar estos colores), pero puede modificar esto para replicar su ejemplo.
Editar: también, se
0, 0, 0, theButton.getHeight()
refiere a las coordenadas x0, y0, x1, y1 del gradiente. Básicamente, comienza en x = 0 (lado izquierdo), y = 0 (arriba) y se extiende hasta x = 0 (queremos un gradiente vertical, por lo que no es necesario un ángulo de izquierda a derecha), y = la altura del botón Entonces el gradiente va en un ángulo de 90 grados desde la parte superior del botón hasta la parte inferior del botón.Editar: Bueno, tengo una idea más que funciona, jaja. En este momento funciona en XML, pero también debería ser factible para formas en Java. Es un poco complejo, e imagino que hay una manera de simplificarlo en una sola forma, pero esto es lo que tengo por ahora:
green_horizontal_gradient.xml
half_overlay.xml
layer_list.xml
test.xml
Bien, entonces básicamente he creado un degradado de forma en XML para el degradado verde horizontal, establecido en un ángulo de 0 grados, que va desde el color verde izquierdo del área superior hasta el color verde derecho. A continuación, hice un rectángulo de forma con un gris medio transparente. Estoy bastante seguro de que podría incluirse en el XML de la lista de capas, obviando este archivo adicional, pero no estoy seguro de cómo. Pero bueno, entonces el tipo de parte hacky viene en el archivo XML de layer_list Puse el degradado verde como la capa inferior, luego puse la mitad superpuesta como la segunda capa, compensada desde la parte superior por 50dp. Obviamente, querrás que este número sea siempre la mitad del tamaño de tu vista, y no un 50dp fijo. Sin embargo, no creo que puedas usar porcentajes. A partir de ahí, acabo de insertar un TextView en mi diseño test.xml, usando el archivo layer_list.xml como fondo.
Tada!
Una edición más : me he dado cuenta de que puede incrustar las formas en la lista de capas dibujables como elementos, lo que significa que ya no necesita 3 archivos XML separados. Puedes lograr el mismo resultado combinándolos así:
layer_list.xml
¡Puedes colocar tantos elementos como quieras de esta manera! Puedo intentar jugar y ver si puedo obtener un resultado más versátil a través de Java.
Creo que esta es la última edición ... : Ok, entonces definitivamente puedes arreglar el posicionamiento a través de Java, como el siguiente:
¡Sin embargo! Esto lleva a otro problema molesto, ya que no puede medir TextView hasta después de que se haya dibujado. Todavía no estoy seguro de cómo puede lograr esto ... pero insertar manualmente un número para topInset funciona.
Mentí, una edición más
Bien, descubrí cómo actualizar manualmente esta capa dibujable para que coincida con la altura del contenedor, la descripción completa se puede encontrar aquí . Este código debe ir en su método onCreate ():
Y ya he terminado! ¡Uf! :)
fuente
Puede superponer formas de degradado en el xml utilizando una lista de capas. Imagine un botón con el estado predeterminado como se muestra a continuación, donde el segundo elemento es semitransparente. Agrega una especie de viñeteado. (Por favor, disculpe los colores personalizados).
fuente
PUEDE hacerlo usando solo formas xml, solo use la lista de capas Y el relleno negativo de esta manera:
fuente
Pruebe este método y luego puede hacer todo lo que quiera.
Es como una pila, así que tenga cuidado de qué elemento viene primero o último.
fuente
¿Has intentado superponer un degradado con una opacidad casi transparente para el resaltado en la parte superior de otra imagen con una opacidad opaca para el degradado verde?
fuente