Gradiente circular no Android

109

Estou tentando fazer um gradiente que emite do meio da tela em branco e se transforme em preto conforme se move em direção às bordas da tela.

À medida que faço um gradiente "normal" como este, tenho experimentado 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>

Ao usar a forma "oval", pelo menos obtive uma forma redonda, mas não houve efeito de gradiente. Como posso conseguir isso? '

pgsandstrom
fonte

Respostas:

241

Você pode obter um gradiente circular usando android:type="radial":

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient android:type="radial" android:gradientRadius="250dp"
        android:startColor="#E9E9E9" android:endColor="#D4D4D4" />
</shape>
Dan Lew
fonte
108
Não apenas funcionou, mas também resolveu a fome mundial! Obrigado!
pgsandstrom
2
Nota lateral: Também é possível usar o byte de transparência na cor. # ff00ff00 a # 7f0000ff desaparecerá do vermelho totalmente opaco para o azul semitransparente.
Simon Forsberg
10
android: gradientRadius = "250" será ignorado. Você deve apontar para um recurso dimen com um valor px ou dp, como: android: gradientRadius = "@ dimen / gradient_radius"
Bolling
2
Obrigado Bolling, você está certo de que o android: gradientRadius = "250" não funciona, acho que se comportava de maneira diferente nas versões mais antigas do Android.
Justin
112

Sempre considero as imagens úteis quando aprendo um novo conceito, então esta é uma resposta complementar.

insira a descrição da imagem aqui

Os %pmeios uma percentagem do pai, isto é, a percentagem da dimensão mais estreita do que quer ver vamos definir nossa drawable diante. As imagens acima foram geradas alterando o gradientRadiusneste 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 pode ser definido em um backgroundatributo de visualização como este

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

Centro

Você pode alterar o centro do raio com

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

onde os decimais são frações da largura e altura de xe yrespectivamente.

insira a descrição da imagem aqui

Documentação

Aqui estão algumas notas da documentação explicando as coisas um pouco mais.

android:gradientRadius

Raio do gradiente, usado apenas com gradiente radial. Pode ser uma dimensão explícita ou um valor fracionário em relação à dimensão mínima da forma.

Pode ser um valor de ponto flutuante, como "1,2".

Pode ser um valor de dimensão, que é um número de ponto flutuante anexado a uma unidade como "14,5 sp". As unidades disponíveis são: px (pixels), dp (pixels independentes da densidade), sp (pixels redimensionados com base no tamanho de fonte preferido), em (polegadas) e mm (milímetros).

Pode ser um valor fracionário, que é um número de ponto flutuante anexado a% ou% p, como "14,5%". O sufixo% sempre significa uma porcentagem do tamanho base; o sufixo% p opcional fornece um tamanho relativo a algum contêiner pai.

Suragch
fonte
no tipo kikat radial funcionará quando você remover% p do raio do gradiente Para Kikat android: gradientRadius = "10"
mehmoodnisar125
1
@ mehmoodnisar125, adicionei uma nota da documentação explicando a diferença entre incluir %ou não.
Suragch 01 de
4

Você também pode fazer isso em código se precisar de mais controle, por exemplo, várias cores e posicionamento. Aqui está meu snippet Kotlin para criar um gradiente radial drawable:

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 (mas sinta-se à vontade para ajustar com parâmetros adicionais):

view.background = ShaderUtils.radialGradientBackground(Color.TRANSPARENT, BLACK)
Gasper Kolenc
fonte
1

Eu acho que você deve adicionar 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 exemplo exibe um gradiente horizontal de branco a preto e branco.

dhesse
fonte
13
Essa resposta deve ser marcada como a solução. Não importa se você deseja fazer um gradiente radial, faça um horizontal!
erdomester
1

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

Nazmul
fonte
1

Aqui está o xml completo com gradiente, curso e formato circular.

<?xml version="1.0" encoding="utf-8"?>

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <!-- You can use gradient with below attributes-->
    <gradient
        android:angle="90"
        android:centerColor="#555994"
        android:endColor="#b5b6d2"
        android:startColor="#555994"
        android:type="linear" />

    <!-- You can omit below tag if you don't need stroke -->
   <stroke android:color="#3b91d7" android:width="5dp"/>

    <!-- Set the same value for both width and height to get a circular shape -->
    <size android:width="200dp" android:height="200dp"/>


    <!--if you need only a single color filled shape-->
    <solid android:color="#e42828"/>


</shape>
Shihab Uddin
fonte
Bom exemplo. Obrigado.
Sinan Ceylan
-1

<!-- Drop Shadow Stack -->
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#00CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#10CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#20CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#30CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#50CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>

<!-- Background -->
<item>
    <shape android:shape="oval">
        <gradient
            android:startColor="@color/colorAccent_1"
            android:centerColor="@color/colorAccent_2"
            android:endColor="@color/colorAccent_3"
            android:angle="45"
            />
        <corners android:radius="3dp" />
    </shape>
</item>

<color name="colorAccent_1">#6f64d6</color>
<color name="colorAccent_2">#7668F8</color>
<color name="colorAccent_3">#6F63FF</color>
CHirag RAmi
fonte