Gostaria de criar uma forma semelhante à seguinte imagem:
Observe a metade superior dos gradientes da cor 1 à cor 2, mas há uma metade inferior dos gradientes da cor 3 à cor 4. Eu sei como fazer uma forma com um único gradiente, mas não sei como dividir uma forma em duas metades e faça 1 forma com 2 gradientes diferentes.
Alguma ideia?
Respostas:
Não acho que você possa fazer isso em XML (pelo menos não no Android), mas encontrei uma boa solução postada aqui que parece ser uma grande ajuda!
Basicamente, a matriz int permite selecionar várias paradas de cores, e a seguinte matriz flutuante define onde essas paradas são posicionadas (de 0 a 1). Você pode, como indicado, usar isso como um Drawable padrão.
Editar: veja como você pode usar isso no seu cenário. Digamos que você tenha um botão definido em XML da seguinte forma:
Você colocaria algo assim no método onCreate ():
Não posso testar isso no momento, esse é o código da minha cabeça, mas basicamente basta substituir ou adicionar paradas para as cores que você precisa. Basicamente, no meu exemplo, você começaria com um verde claro, desbotaria levemente para o branco antes do centro (para dar uma desbotamento, em vez de uma transição severa), desbotaria do branco para o verde médio entre 45% e 55% e depois desbotaria verde médio a verde escuro de 55% até o final. Isso pode não parecer exatamente com sua forma (no momento, não tenho como testar essas cores), mas você pode modificá-lo para replicar seu exemplo.
Editar: Além disso,
0, 0, 0, theButton.getHeight()
refere-se às coordenadas x0, y0, x1, y1 do gradiente. Então, basicamente, começa em x = 0 (lado esquerdo), y = 0 (em cima) e se estende até x = 0 (estamos querendo um gradiente vertical, portanto, nenhum ângulo da esquerda para a direita é necessário), y = a altura do botão Portanto, o gradiente vai em um ângulo de 90 graus, da parte superior do botão até a parte inferior do botão.Edit: Ok, então eu tenho mais uma idéia que funciona, haha. No momento, ele funciona em XML, mas também deve ser possível para formas em Java. É meio complexo, e imagino que há uma maneira de simplificá-lo em uma única forma, mas é isso que tenho por enquanto:
green_horizontal_gradient.xml
half_overlay.xml
layer_list.xml
test.xml
Ok, basicamente criei um gradiente de forma em XML para o gradiente horizontal verde, definido em um ângulo de 0 grau, passando da cor verde esquerda da área superior para a cor verde direita. Em seguida, fiz um retângulo de forma com um meio cinza transparente. Tenho certeza de que isso pode estar embutido no XML da lista de camadas, evitando esse arquivo extra, mas não sei como. Mas tudo bem, então o tipo de parte hacky entra no arquivo XML layer_list. Coloquei o gradiente verde como camada inferior e depois coloque a meia sobreposição como segunda camada, deslocada do topo em 50dp. Obviamente, você deseja que esse número seja sempre metade do tamanho da visualização, e não 50dp fixo. Eu acho que você não pode usar porcentagens. A partir daí, eu apenas inseri um TextView no meu layout test.xml, usando o arquivo layer_list.xml como plano de fundo.
Tada!
Mais uma edição : eu percebi que você pode incorporar as formas na lista de camadas que podem ser desenhadas como itens, o que significa que você não precisa mais de 3 arquivos XML separados! Você pode obter o mesmo resultado combinando-os da seguinte forma:
layer_list.xml
Você pode colocar em camadas quantos itens quiser dessa maneira! Eu posso tentar brincar e ver se consigo um resultado mais versátil através do Java.
Acho que esta é a última edição ... : Ok, então você pode definitivamente corrigir o posicionamento através de Java, como o seguinte:
Contudo! Isso leva a outro problema irritante, pois você não pode medir o TextView até que ele tenha sido desenhado. Ainda não tenho certeza de como você pode fazer isso ... mas inserir manualmente um número para topInset funciona.
Eu menti, mais uma edição
Ok, descobri como atualizar manualmente essa camada desenhável para corresponder à altura do contêiner, descrição completa pode ser encontrada aqui . Este código deve ir no seu método onCreate ():
E eu terminei! Uau! :)
fonte
Você pode estratificar formas de gradiente no xml usando uma lista de camadas. Imagine um botão com o estado padrão como abaixo, onde o segundo item é semitransparente. Ele adiciona uma espécie de vinheta. (Por favor, desculpe as cores definidas automaticamente.)
fonte
Você pode fazê-lo usando apenas formas xml - basta usar a lista de camadas E o preenchimento negativo como este:
fonte
Experimente esse método e faça o que quiser.
É como uma pilha, portanto, tenha cuidado com o item que vem primeiro ou por último.
fonte
Você tentou sobrepor um gradiente com uma opacidade quase transparente para o destaque em cima de outra imagem com uma opacidade opaca para o gradiente verde?
fonte