Как добавить альфа-канал к существующему цвету 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.
После запуска приложения ресурсы находятся в режиме только для чтения. Вы не можете изменить их программным способом надлежащим образом.