Как добавить альфа-канал к существующему цвету Android в XML

У меня есть следующий цвет в values/colors.xml:

<color name="grey_1">#0F0E10</color>

Я хочу сослаться на этот цвет в градиенте:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:type="linear"
        android:angle="-90"
        android:startColor="#000F0E10"
        android:endColor="#990F0E10"/>
</shape>

Однако это дублирует определение цвета RGB. В идеале я хотел бы написать что-то вроде этого:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:type="linear"
        android:angle="-90"
        android:startColor="alpha(00, @color/grey_1)"
        android:endColor="alpha(99, @color/grey_1)"/>
</shape>

или это:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:type="linear"
        android:angle="-90"
        android:startColor="@color/grey_1"
        android:startTransparency="#00"
        android:endColor="@color/grey_1"
        android:endTransparency="#99"/>
</shape>

Это возможно?

5 ответов

Решение

Вы должны сделать это в коде. Вы можете получить такой цвет,

int color = getResources().getColor(R.color.<the color>);

Вы можете превратить его в ARGB следующим образом:

int a = Color.alpha(color);
int r = Color.red(color);
int g = Color.green(color);
int b = Color.blue(color);

Теперь вы можете воссоздать цвет с любой альфа-версией:

color = Color.argb(<new alpha>, r, g, b);

Это, конечно, означает, что вам нужно будет построить свой рисованный объект из кода. Не так чисто, но возможно.

Вы можете сделать это в API 23 и выше с помощью ColorStateList,

Из документов:

Начиная с API 23, элементы могут по желанию определять атрибут android: alpha для изменения непрозрачности основного цвета. Этот атрибут принимает либо значение с плавающей точкой от 0 до 1, либо атрибут темы, который разрешается как таковой. Общий цвет элемента рассчитывается путем умножения альфа-канала основного цвета на альфа-значение. Например, следующий элемент представляет цвет акцента темы с непрозрачностью 50%:

<item android:state_enabled="false"
      android:color="?android:attr/colorAccent"
      android:alpha="0.5" />

Таким образом, в моем случае я бы сделал:

color/gradient_start_color.xml:

<item android:color="@color/grey_1"
      android:alpha="0" />

color/gradient_end_color.xml:

<item android:color="@color/grey_1"
      android:alpha="0.6" />

drawable/gradient.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:type="linear"
        android:angle="-90"
        android:startColor="@color/gradient_start_color"
        android:endColor="@color/gradient_end_color" />
</shape>

Я также хотел бы отметить, что это можно сделать программно с помощью ColorStateList.withAlpha().

вот так:

      csl.withAlpha(0) //transparent
csl.withAlpha(255) //opaque

Попробуй использоватьColorUtilsкласс изandroidx.core.graphicsпакет, например;

       int color = getResources().getColor(R.color.border_active_default);
 circle.setFillColor(ColorUtils.setAlphaComponent(color,50));

Тогда вам не нужно реализовывать свой собственный индивидуальный подход.

Вы должны установить два разных цвета в качестве начального и конечного цветов.

Помните, что цвета определяются следующим образом: #AARRGGBB для Alpha, Red, Green и Blue.

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

Другие вопросы по тегам