更改视图颜色但保持波纹和触摸状态

Change color of view but keep ripple and touch state

开箱即用,您可以获得白色 ripple/touch 状态: ?attr/selectableItemBackground 我希望能够制作任何颜色,波纹和触摸状态仅根据我设置的颜色工作。如果我能通过 android:theme

做到这一点就好了

我需要这个才能工作 API 15+

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

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

我希望它尽可能简单和可重复使用。

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

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

截至 API 15+ 支持,据我所知,由于某些限制,即使 AppCompat 也不向后移植涟漪效应,请参阅 FAQ here。我个人认为以下 "graceful degradation" 合理:

  • ?attr/selectableItemBackgroundBorderless — 对于 Lollipop 之前的设备
  • ?attr/selectableItemBackground — Lollipop 及以上

用作背景(卡片前景)

希望这对您有所帮助

您已经 post 说的非常正确:

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

我认为除了使用库或自己编写代码之外,没有什么比这更重要的了。您可以通过代码生成涟漪、使用主题属性等。

我遇到了同样的问题,我只是写了一堆 classes 来轻松创建涟漪。例如,为了获得主题颜色,我写了一个简单的 class of 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" />

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