Круговий градієнт в андроїді


109

Я намагаюся зробити градієнт, який випромінюється з середини екрана білим кольором, і перетворюється на чорний, коли він рухається до країв екрана.

Коли я роблю "звичайний" градієнт, як це, я експериментував з різними формами:

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

Під час використання «овальної» форми я принаймні набув круглої форми, але градієнтного ефекту не було. Як я можу цього досягти? '

Відповіді:


241

Ви можете отримати круговий градієнт, використовуючи 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>

108
Це не тільки спрацювало, але й вирішило всесвітнє голодування! Дякую!
pgsandstrom

2
Бічна примітка: Також можна використовувати прозорий байт у кольорі. # ff00ff00 до # 7f0000ff зникне від повністю непрозорого червоного до напівпрозорого синього.
Саймон Форсберг

10
android: gradientRadius = "250" буде проігноровано. Ви повинні вказати на ресурс розміру зі значенням px або dp, як-от: android: gradientRadius = "@ dimen / gradient_radius"
Боллінг

2
Дякую Боллінгу, ти маєш рацію, що андроїд: gradientRadius = "250" взагалі не працює, я думаю, що в старих версіях Android він поводився інакше.
Джастін

112

Я завжди вважаю образи корисними під час вивчення нової концепції, тому це додаткова відповідь.

введіть тут опис зображення

Це %pозначає відсоток батьківського, тобто відсоток від самого вузького виміру будь-якого виду, який ми встановимо. Зображення, наведені вище, були створені зміною gradientRadiusцього коду

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>

Які можна встановити на такий backgroundатрибут представлення

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

Центр

Ви можете змінити центр радіуса за допомогою

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

де десяткові є частки ширини і висоти для xі yвідповідно.

введіть тут опис зображення

Документація

Ось кілька приміток із документації, що пояснюють речі трохи більше.

android:gradientRadius

Радіус градієнта, що використовується тільки при радіальному градієнті. Може бути явним розміром або дробовим значенням щодо мінімального розміру форми.

Може бути значенням з плаваючою комою, наприклад "1,2".

Може бути значенням розміру, яке є числом з плаваючою комою, додане до одиниці, такої як "14.5sp". Доступні одиниці: px (пікселі), dp (незалежні від щільності пікселі), sp (масштабовані пікселі на основі бажаного розміру шрифту), в (дюйми) та mm (міліметри).

Може бути дробовим значенням, яке є числом з плаваючою комою, додане або% або% p, наприклад "14,5%". Суфікс% завжди означає відсоток від базового розміру; необов'язковий суфікс% p забезпечує розмір відносно деякого батьківського контейнера.


в радіусі типу kikat буде працювати, коли ви видалите% p із радіуса градієнта Для андроїда Kikat: gradientRadius = "10"
mehmoodnisar125

1
@ mehmoodnisar125, я додав примітку із документації, що пояснює різницю між включенням %чи ні.
Сурагч

4

Ви також можете це зробити в коді, якщо вам потрібно більше контролю, наприклад, декілька кольорів та позиціонування. Ось мій фрагмент Котліна для створення мальованого радіального градієнта:

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
    }
}

Основне використання (але сміливо налаштовуйте додаткові параметри):

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

1

Я думаю, вам слід додати 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>

Цей приклад відображає горизонтальний градієнт від білого до чорного до білого.


13
Цю відповідь слід позначити як рішення. Незалежно від того, що ви хочете зробити радіальний градієнт, робіть горизонтальний!
erdomester

1

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


1

Ось повний xml з градієнтом, косою та круглою формою.

<?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>

Хороший приклад. Дякую.
Синан Джейлан

-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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.