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

Android 更改视图颜色,但保持波纹和触摸状态,android,material-design,Android,Material Design,开箱即用,您可以通过以下方式获得白色波纹/触摸状态: ?属性/可选择项背景 我想有能力做任何颜色和涟漪和触摸状态只是工作的基础上我设置的颜色。如果我能通过android:theme做到这一点,那就太好了 我需要这个工作API 15+ 我知道我可以做一个选择器和一个涟漪,但是我必须为每种颜色做一个选择器,因为在XMLPreAPI21中不能做attr 如果我只将一种颜色设置为背景,则纹波和触摸状态不起作用 我只希望这是尽可能简单和可重用的 是否有我遗漏的东西或任何相对干净的解决方案。涟漪颜色似乎由c

开箱即用,您可以通过以下方式获得白色波纹/触摸状态: ?属性/可选择项背景 我想有能力做任何颜色和涟漪和触摸状态只是工作的基础上我设置的颜色。如果我能通过android:theme做到这一点,那就太好了

我需要这个工作API 15+

我知道我可以做一个选择器和一个涟漪,但是我必须为每种颜色做一个选择器,因为在XMLPreAPI21中不能做attr

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

我只希望这是尽可能简单和可重用的


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

涟漪颜色似乎由
colorControlHighlight
属性控制,例如主题中的
@color/rippleColor

就API 15+支持而言,据我所知,由于某些限制,即使是AppCompat也不会产生后端口涟漪效应,请参阅。就我个人而言,我认为以下“优雅降级”是明智的:

  • ?attr/selectableitemsbackgroundless
    -用于棒棒糖前的设备
  • ?attr/selectableItemBackground
    -用于棒棒糖及以上
用作背景(卡片的前景)


希望这有帮助

您已经发布的内容非常真实:

  • 仅通过指定颜色无法创建涟漪选择器
  • 使用API<21时,不可能在xml中使用主题属性
我不认为有什么比仅仅使用一个库或自己编写代码更重要的了。从代码中,您可以生成涟漪、使用主题属性等

我也有同样的问题,我只是写了一堆简单的ripple创建类。例如,为了获得主题颜色,我编写了一个简单的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;
    }
}
然后我为ripple颜色和样式添加了属性。我还必须覆盖setBackground方法,以便为视图设置涟漪不会清除其背景。现在,使用自定义颜色设置涟漪非常简单:

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


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

是的,但我希望波纹/触摸状态为红色、蓝色或绿色,具体取决于我的主题或我为视图提供的某种颜色。我可以只使用一个选择器(旧设备上的触摸状态),但我希望能够轻松更改ripple/touch状态的颜色。好的,您可以设置每个主题的属性,然后在每个活动甚至每个视图中使用此主题(尽管只有一次,当视图膨胀时)。想到的另一个解决方案是简单地以编程方式在背景上设置一个颜色过滤器,但这可能无法很好地处理statesHow,如果您在API Hm上更改触摸状态的颜色。。。事实上,我不确定。我认为该属性应用于
selectableitembackgroundless
,因为我只需要灰色(selectableItemBackground有蓝色)。但显然不是,所以要找到正确的属性需要一些努力。在一天结束时,人们可以简单地创建自己的状态绘制,因为我不需要旧版本的涟漪。我想要一个简单的解决方案。我同意它只是一个触摸状态。我想要的是attr/selectableItemBackground,它可以在任何视图上工作。然后有另一个字段,告诉selectableitembackground颜色是什么。类似于:android:background=“?attr/selectableitemsbackground”android:backgroundTint=“@color/red”也许我可以修改selectableitemsbackgrounds代码并将其复制到我的项目中。我不知道如何找到该代码,但您可以在此处找到默认选择器: