改变视图的颜色,但保持纹波和触摸状态

时间:2015-05-08 13:47:05

标签: android material-design

开箱即用,您可以从以下位置获得白色波纹/触摸状态: ?ATTR / selectableItemBackground 我希望能够做任何颜色,并且纹波和触摸状态只是根据我设置的颜色工作。如果我能通过android:theme

做到这一点会很好

我需要这个才能使用API​​ 15 +

我知道我可以做一个选择器和一个波纹但是我必须为每个颜色做一个选择器,因为你不能在xml pre API 21中做attr。

如果我只为背景设置一种颜色,那么纹波和触摸状态就不起作用。

我希望这样做尽可能简单和可重复使用。

是否有我遗漏的东西或任何相对干净的解决方案。

2 个答案:

答案 0 :(得分:2)

纹波颜色似乎由colorControlHighlight属性控制,例如你主题中的<item name="android:colorControlHighlight">@color/rippleColor</item>

自API 15+支持以来,据我所知,即使AppCompat因为某些限制而没有后端效应,请参阅FAQ here。就个人而言,我发现以下情况&#34;优雅退化&#34;明智的:

  • ?attr/selectableItemBackgroundBorderless - 适用于前Lollipop设备
  • ?attr/selectableItemBackground - 适用于Lollipop及以上

用作背景(卡片的前景)

希望这有帮助

答案 1 :(得分:1)

您已发布的内容非常正确:

  • 仅通过指定颜色
  • 无法创建波纹选择器
  • 使用API​​&lt; 无法在xml中使用主题属性21

我认为除了自己使用图书馆或编码之外别无其他。从代码中,您可以生成涟漪,使用主题属性等。

我遇到了同样的问题,我刚刚编写了一堆类来轻松创建波纹。例如,为了获得主题颜色,我编写了一个简单的ColorStateList类:

public class ControlCheckedColorStateList extends ColorStateList {
    public ControlCheckedColorStateList(Context context) {
        super(new int[][]{
                new int[]{android.R.attr.state_checked},
                new int[]{}
        }, new int[]{
                getThemeColor(context, R.attr.colorPrimary),
                getThemeColor(context, R.attr.colorControl)
        });
    }

    public static int getThemeColor(Context context, int attr) {
        Resources.Theme theme = context.getTheme();
        TypedValue typedvalueattr = new TypedValue();
        theme.resolveAttribute(attr, typedvalueattr, true);
        return typedvalueattr.resourceId != 0 ? context.getResources().getColor(typedvalueattr.resourceId) : typedvalueattr.data;
    }
}

然后我添加了波纹颜色和样式的属性。我还必须覆盖setBackground方法,因此为视图设置涟漪并不清除其背景。现在使用自定义颜色设置波纹非常简单:

<carbon.widget.Button
    android:background="#ffffffff"
    app:carbon_rippleColor="#40ff0000"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

很多代码行,所以我认为在这里发布所有内容并不合理。如果您愿意,可以从我的库中打开任何小部件类,并检查它是否是您正在寻找的内容。您可以在github上找到我的代码。如有任何问题,请随时提出。