Как добавить альфа-канал к существующему цвету Android в XML - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть следующий цвет в 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>

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

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

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);

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

0 голосов
/ 08 ноября 2018

Вы можете сделать это в 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>
0 голосов
/ 06 ноября 2018

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

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

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

...