Можно ли использовать GradientColor для определения градиента для заливки или штриха полностью в XML?

Я смотрел документацию для GradientColor https://developer.android.com/reference/android/R.styleable.html#GradientColor . Как определить цвет градиента в XML и применить его к XML-вектору?

Я пробовал в цвете.xml, стили.XML и в XML-векторные катры.

Я получаю ошибку "не удалось преобразовать @id / gradclor в ColorStateList" с:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="120dp"
    android:height="120dp"
    android:viewportWidth="120.0"
    android:viewportHeight="120.0">

    <path
        android:name="play_triangle"
        android:pathData="M 30 30 L 30 90 L 80 60 z"
        android:strokeColor="@id/gradclor"
        android:strokeWidth="5"/>

    <color
        android:name="@+id/gradclor"
        android:startColor="#FFFFFF"
        android:endColor="#00FFFF"
        android:angle="145"/>

</vector>

или "Не удалось преобразовать #FFFFFFFF #00FFFFFF 145 в ColorStateList " при использовании:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="120dp"
    android:height="120dp"
    android:viewportWidth="120.0"
    android:viewportHeight="120.0">

    <path
        android:name="play_triangle"
        android:pathData="M 30 30 L 30 90 L 80 60 z"
        android:strokeColor="@color/GradientStrokeBorder"
        android:strokeWidth="5"/>

</vector>

со следующим цветом.XML-код:

<color name="GradientStrokeBorder">
    <item name="android:startColor">#FFFFFF</item>
    <item name="android:endColor">#00FFFF</item>
    <item name="android:angle">145</item>
</color>

3 ответов


Я наконец-то сделал это. Функция градиентного цвета еще не поддерживается в Android Studio (текущая версия 2.2), поэтому она не помогает вам с автозаполнением, но вместо этого помечает тег градиента как ошибку. Тем не менее, функция действительно работает, я успешно протестировал ее на Nexus 5X / API 24. Конечно, вы должны использовать устройство API 24+, потому что в противном случае эта функция не поддерживается ОС.

во-первых, вам нужно добавить файл ресурса цвета как это:

<?xml version="1.0" encoding="utf-8"?>
<gradient xmlns:android="http://schemas.android.com/apk/res/android"
    android:startColor="#FFFFFF"
    android:centerColor="#0000FF"
    android:endColor="#00FFFF"
    android:angle="145"
    android:startX="30"
    android:endX="70"
    android:startY="30"
    android:endY="70"
    android:type="linear"/>

обратите внимание на начальные / конечные параметры, поскольку я обнаружил, что они необходимы для векторных градиентов.

поместите этот файл в папку res/color под некоторым именем. Я назвал его градиентом.xml таким образом, полный путь-это res/color / gradient.XML. После этого вы можете обратиться к этому ресурсу в атрибутах цвета, включая цвета векторного пути:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="120dp"
    android:height="120dp"
    android:viewportWidth="120.0"
    android:viewportHeight="120.0">

    <path
        android:name="play_triangle"
        android:pathData="M 30 30 L 30 90 L 80 60 z"
        android:strokeWidth="10"
        android:strokeColor="@color/gradient"/>

</vector>

обратите внимание на ссылку на цветовой ресурс градиента в strokeColor. Надеюсь, это поможет!


последний предварительный просмотр Android (3.1 Canary 6) содержит образец с использованием векторного ресурса с градиентом.

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportHeight="108"
    android:viewportWidth="108">
    <path
        android:fillType="evenOdd"
        android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
        android:strokeColor="#00000000"
        android:strokeWidth="1">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endX="78.5885"
                android:endY="90.9159"
                android:startX="48.7653"
                android:startY="61.0927"
                android:type="linear">
                <item
                    android:color="#44000000"
                    android:offset="0.0" />
                <item
                    android:color="#00000000"
                    android:offset="1.0" />
            </gradient>
        </aapt:attr>
    </path>
    <path
        android:fillColor="#FFFFFF"
        android:fillType="nonZero"
        android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
        android:strokeColor="#00000000"
        android:strokeWidth="1" />
</vector>

Я не уверен в этом, но согласно документ:

android: strokeColor Задает цвет, используемый для рисования контура. может быть цвет или, для SDK 24+, список состояний цвета или цвет градиента (см. GradientColor и GradientColorItem). Если это свойство анимировано, любое значение, заданное анимацией, будет переопределять исходное значение. Контур пути не отображается, если это свойство не указано.

Если ваш sdk

С другой стороны, если ваш sdk больше 24, я думаю, что было бы лучше использовать <gradient/> чтобы заполнить свой путь вместо <color/>