改变视图的颜色但保留涟漪和触摸状态

4
你可以从以下代码中获取默认的白色波纹/触摸状态: ?attr/selectableItemBackground 我希望能够以任何颜色设置波纹和触摸状态,并且基于我设置的颜色,波纹和触摸状态能够正常工作。如果可以通过android:theme实现这一点,那就太好了。
我需要这个功能在API 15+上运行。
我知道我可以使用selector和ripple,但因为在API 21之前不能在xml中使用attr,所以我必须为每种颜色创建一个selector。
如果我只将背景设为一种颜色,则波纹和触摸状态不起作用。
我希望这样做尽可能简单和可重复使用。
是否有我遗漏的东西或相对干净的解决方案呢?
2个回答

2
涟漪颜色似乎由colorControlHighlight属性控制,例如在您的主题中使用<item name="android:colorControlHighlight">@color/rippleColor</item>。从API 15+支持开始,据我所知,即使是AppCompat也不会回退涟漪效果,因为存在某些限制,请参见此处的FAQ。个人认为以下“优雅降级”是合理的:

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

作为背景(卡片前景)使用。

希望这可以帮助到您。


1
是的,但我希望例如涟漪/触摸状态可以根据我的主题或我为视图设置的某种颜色而变为红色、蓝色或绿色。我可以接受只有一个选择器(在较旧的设备上是触摸状态),但我想要轻松更改涟漪/触摸状态的颜色能力。 - David Corrado
你可以按主题设置属性,然后在每个活动中使用该主题,甚至可以在每个视图中使用(尽管只能在视图被填充时使用一次)。另一个解决方案是在程序中对背景设置颜色过滤器,但这可能无法很好地处理状态。 - Actine
你如何更改API <21上触摸状态的颜色? - David Corrado
嗯...其实我不太确定。我认为该属性应用于 selectableItemBackgroundBorderless,因为我所需要的只是灰色背景(而selectableItemBackground是蓝色)。但显然它并不是这样,所以寻找正确的属性需要一些努力。总而言之,在21版本以下,人们可以简单地创建自己的状态可绘制图案。 - Actine

1

你之前发表的内容非常正确:

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

我认为除了使用库或自己编写代码外,没有其他更好的方法。从代码中,您可以生成涟漪,使用主题属性等。

我曾经遇到过同样的问题,我只是编写了一堆类来轻松创建涟漪。例如,要获取主题颜色,我编写了一个简单的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 上找到我的代码。如果有任何问题,请随时提问。

我不需要在旧版本上产生涟漪效果。我想要一个简单的解决方案。 我可以接受它只是一个触摸状态。我希望attr/selectableItemBackground适用于我认为的每个视图。然后再有另一个字段,你可以告诉selectableitembackground应该是什么颜色。类似这样: android:background="?attr/selectableItemBackground" android:backgroundTint="@color/red"也许我可以修改selectableItemBackgrounds的代码并将其复制到我的项目中。但我不知道如何找到那段代码。 - David Corrado
您可以在此处找到默认选择器:http://androidxref.com/5.1.0_r1/xref/frameworks/base/core/res/res/drawable/item_background.xml - Zielony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接