如何在XML

时间:2018-11-05 22:44:14

标签: android android-resources android-color

我在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 :(得分:1)

您必须使用代码来完成。你可以得到这样的颜色

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

这当然意味着您需要从代码构造可绘制对象。不太干净,但是可能。

答案 1 :(得分:0)

您必须设置两种不同的颜色作为开始和结束颜色。

请记住,颜色是通过以下方式定义的:#AARRGGBB用于Alpha,红色,绿色和蓝色。

启动应用后,资源将处于只读模式。您无法通过编程方式正确地更改它们。

答案 2 :(得分:0)

您可以在API 23及更高版本中使用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>