ColorStateList
来执行此操作。
来自文档:
从 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>
你必须用代码来完成。你可以得到这样的颜色,
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);
这当然意味着您需要从代码构建您的可绘制对象。不是那么干净,但可能。
您必须设置两种不同的颜色作为起始颜色和结束颜色。
请记住,颜色是这样定义的:#AARRGGBB 表示 Alpha、红色、绿色和蓝色。
应用程序启动后,资源处于只读模式。您无法以正确的方式以编程方式更改它们。
尝试使用
ColorUtils
包中的 androidx.core.graphics
类,例如;
int color = getResources().getColor(R.color.border_active_default);
circle.setFillColor(ColorUtils.setAlphaComponent(color,50));
那么您就不必实现自己的自定义方法。
我还想指出,它可以通过编程方式完成 ColorStateList.withAlpha()
像这样:
csl.withAlpha(0) //transparent
csl.withAlpha(255) //opaque