Я хотел бы создать форму, похожую на следующее изображение:
Обратите внимание на верхнюю половину градиентов от цвета 1 до цвета 2, но есть нижняя половина, градиенты от цвета 3 до цвета 4. Я знаю, как сделать форму с одним градиентом, но я не уверен, как разбить форму на две половинки и сделать 1 форму с 2 различными градиентами.
Любые идеи?
Ответы:
Я не думаю, что вы можете сделать это в XML (по крайней мере, в Android), но я нашел хорошее решение, опубликованное здесь, которое выглядит так, как будто это очень поможет!
По сути, массив int позволяет вам выбрать несколько цветовых остановок, а следующий массив с плавающей точкой определяет, где эти остановки расположены (от 0 до 1). Затем, как уже говорилось, вы можете просто использовать это как стандартный Drawable.
Изменить: Вот как вы могли бы использовать это в вашем сценарии. Допустим, у вас есть кнопка, определенная в XML следующим образом:
Затем вы бы поместили что-то вроде этого в свой метод onCreate ():
Я не могу проверить это в данный момент, это код из моей головы, но в основном просто заменить или добавить остановки для цветов, которые вам нужны. В основном, в моем примере, вы начинаете со светло-зеленого, постепенно переходите в белый цвет перед центром (чтобы дать переход, а не резкий переход), переходите от белого к среднему зеленому между 45% и 55%, затем переходите от от среднего до темно-зеленого от 55% до конца. Возможно, это не совсем похоже на вашу форму (сейчас у меня нет возможности проверить эти цвета), но вы можете изменить это, чтобы повторить ваш пример.
Редактировать: Кроме того,
0, 0, 0, theButton.getHeight()
ссылка относится к координатам градиента x0, y0, x1, y1. Таким образом, в основном, он начинается с x = 0 (левая сторона), y = 0 (верх) и простирается до x = 0 (мы хотим вертикальный градиент, поэтому не требуется угол слева направо), y = высота кнопки. Таким образом, градиент идет под углом 90 градусов от верхней части кнопки до нижней части кнопки.Редактировать: Хорошо, у меня есть еще одна идея, которая работает, ха-ха. Прямо сейчас это работает в XML, но должно быть выполнимо и для фигур в Java. Это довольно сложно, и я думаю, что есть способ упростить его до единой формы, но вот что я получил сейчас:
green_horizontal_gradient.xml
half_overlay.xml
layer_list.xml
test.xml
Итак, в основном я создал градиент формы в XML для горизонтального зеленого градиента, установленный под углом 0 градусов, переходящий от левого зеленого цвета верхней области к правому зеленому цвету. Затем я сделал прямоугольник с полупрозрачным серым цветом. Я почти уверен, что это может быть встроено в XML списка слоев, исключая этот дополнительный файл, но я не уверен, как это сделать. Но хорошо, тогда какая-то хакерская часть появляется в XML-файле layer_list. Я поставил зеленый градиент в качестве нижнего слоя, а затем наложил половину наложения в качестве второго слоя со смещением от вершины на 50dp. Очевидно, вы бы хотели, чтобы это число всегда составляло половину от размера вашего представления, а не фиксированного 50dp. Я не думаю, что вы можете использовать проценты, хотя. Оттуда я просто вставил TextView в свой макет test.xml, используя файл layer_list.xml в качестве фона.
Тада!
Еще одно редактирование : я понял, что вы можете просто вставить фигуры в список слоев, которые можно нарисовать как элементы, а это значит, что вам больше не нужно 3 отдельных файла XML! Вы можете достичь того же результата, комбинируя их примерно так:
layer_list.xml
Вы можете наложить столько элементов, сколько хотите, таким образом! Я могу попытаться поиграть и посмотреть, смогу ли я получить более универсальный результат с помощью Java.
Я думаю, что это последнее редактирование ... : Хорошо, так что вы можете определенно исправить позиционирование через Java, как показано ниже:
Тем не мение! Это приводит к еще одной досадной проблеме, заключающейся в том, что вы не можете измерить TextView, пока он не будет нарисован. Я не совсем уверен, как вы можете сделать это ... но ручная вставка числа для topInset работает.
Я соврал, еще один править
Хорошо, узнал, как вручную обновить этот слой для рисования, чтобы он соответствовал высоте контейнера, полное описание можно найти здесь . Этот код должен идти в вашем методе onCreate ():
И я сделал! Уф! :)
источник
Вы можете наложить градиентные фигуры в XML, используя список слоев. Представьте себе кнопку с состоянием по умолчанию, как показано ниже, где второй элемент является полупрозрачным. Это добавляет своего рода виньетирование. (Пожалуйста, извините за определенные пользователем цвета.)
источник
Вы МОЖЕТЕ сделать это, используя только формы XML - просто используйте список слоев И отрицательный отступ, как это:
источник
Попробуйте этот метод, тогда вы можете делать все, что вы хотите.
Это похоже на стек, поэтому будьте осторожны, какой элемент идет первым или последним.
источник
Вы пытались наложить один градиент с почти прозрачной непрозрачностью для выделения поверх другого изображения с непрозрачной непрозрачностью для зеленого градиента?
источник