如何在xml中向现有Android颜色添加alpha通道

nzkunb0c  于 2023-11-15  发布在  Android
关注(0)|答案(5)|浏览(125)

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>


这可能吗?

crcmnpdw

crcmnpdw1#

您可以在API 23和更高版本中使用ColorStateList执行此操作。
从docs:
从API 23开始,项目可以选择性地定义一个android:alpha属性来修改基色的不透明度。该属性接受一个0到1之间的浮点值,或者接受一个按此方式解析的主题属性。项目的整体颜色是通过将基色的alpha通道乘以alpha值来计算的。例如,以下项目表示主题的强调色为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>

jvlzgdj9

jvlzgdj92#

你必须用代码来做。你可以得到这样的颜色,

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


现在你可以用你想要的alpha重新创建颜色:

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


这意味着你当然需要从代码中构造drawable,虽然不那么干净,但也是可能的。

iyr7buue

iyr7buue3#

必须将两种不同的颜色设置为开始颜色和结束颜色。
请记住,颜色是这样定义的:#AARRGGBB代表Alpha,Red,绿色和蓝色。
一旦应用程序启动,资源将处于只读模式。您无法以适当的方式通过编程方式更改它们。

fhg3lkii

fhg3lkii4#

例如,尝试使用androidx.core.graphics包中的ColorUtils类;

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

字符串
那么您就不必实现自己的自定义方法。

vwhgwdsa

vwhgwdsa5#

我还想指出的是,它可以通过ColorStateList.withAlpha()以编程方式完成
就像这样:

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

字符串

相关问题