当使用? attr/selectableItemBack 作为背景时,如何修改纹路颜色?

我已经看到一些这样的问题,他们给出了一些可能的方法来实现我想要的。例如:

  1. 在 styles.xml 中使用 colorControlHighlight属性。

    下面是我的 style-v21. xml:

    <style name="SelectableItemBackground">
    <item name="android:colorControlHighlight">#5677FC</item>
    <item name="android:background">?attr/selectableItemBackground</item>
    </style>
    

    还有我的小工具:

    <TextView
    android:id="@+id/tv_take_photo_as_bt"
    android:layout_width="280dp"
    android:layout_height="48dp"
    android:text="@string/act_take_photo"
    style="@style/SelectableItemBackground"/>
    

    但是没用。我还尝试将 parent="Theme.AppCompat添加到“ SelectableItemBacky”样式,或者更改为 colorControlHighlight(no android: prefix)",或者更改为 ?android:attr/selectableItemBackground,这些都没有用。

  2. 在布局中使用 backgroundTint属性。

    所以我把 android:backgroundTint="#5677FC"加到我的 TextView上。还是没用。然后我试着把 android:backgroundTintMode改成 src_insrc_atop,但它们没有任何作用。

所以,我怎样才能改变纹波颜色时,我使用 ?attr/selectableItemBackground作为背景。我只关注棒棒糖以上的东西。先谢谢你!

76538 次浏览

最后我找到了解决办法: 我应该写另一种风格,而不是在主题 SelectableItemBackground中直接使用 android:colorControlHighlight:

<style name="SelectableItemTheme">
<item name="colorControlHighlight">@color/ripple_color</item>
</style>

然后:

<style name="SelectableItemBackground">
<item name="android:theme">@style/SelectableItemTheme</item>
<item name="android:background">?attr/selectableItemBackground</item>
</style>

最后在 layout.xml 中将 style="@style/SelectableItemBackground"添加到 View

更新于2016/8/26 在 N 的发布之后,我发现有时候我们不能使用这种方法来设置某种 View(例如,CardView)的纹波颜色。现在我强烈推荐开发人员使用 RippleDrawable,它也可以在 xml 中声明。这里有一个例子:

我想显示一个涟漪效应,当用户触摸/点击一个高于 API21的 CardView,当然应该有另一种反馈之前,棒棒糖。所以我应该写:

<android.support.v7.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:foreground="@drawable/selectable_item_background"/>

drawable文件夹中的 selectable_item_background:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@android:color/transparent" />
<item android:drawable="@color/color_clicked" />
</selector>

drawable-v21文件夹中的 selectable_item_background:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ripple_black" />
</selector>

最后,drawable(或 drawable-v21)文件夹中的 ripple_black:

<ripple
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:color="@color/color_clicked"
tools:ignore="NewApi" /> <!--you can remove this line if it's in v21 folder-->

就是这样。对于其他视图,也许应该使用 android:background="@drawable/selectable_item_background"。不要忘记设置一个 OnClickListenerOnTouchListener或类似的东西为他们,否则涟漪不会显示。

公认的答案是错误的。

正确的使用方法是 Liting 在评论中提到的。 使用 colorControlHighlight而不是 android:colorControlHighlight将默认的 colorControlHighlightAppCompat更改为 colorControlHighlight

* 请参阅主题部分的 http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html *

对预置和棒棒糖 + 设备的涟漪效应

哈兰和流亭是正确的。公认的答案不是最好的方法。 让我在代码演示如何改变波纹颜色的 前棒棒糖时代版本和更高

  1. AppTheme 应该从任何 AppCompat 主题继承,并包含 ColorControlHighlight 属性(不带‘ android:’前缀)

    <!-- Application theme. -->
    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="colorControlHighlight">#40ffffff</item>
    </style>
    
  2. Your view should contain clickable="true" (or should have a click listener set programmatically) and background should be "?attr/selectableItemBackgroundBorderless" or "?attr/selectableItemBackground" :

    <LinearLayout
    ...
    android:clickable="true"
    android:background="?attr/selectableItemBackgroundBorderless"/>
    

Note: that if your parent view has white background you won't see ripple effect since it's white. Change colorControlHighlight value for a different color

Also, if you want different ripple colors on different activities you can set personal theme for each activity in Manifest file, for example:

       <activity
android:name="com.myapp.GalleryActivity"
android:theme="@style/RedRippleTheme"
/>

同一活动中不同碎片的不同波纹颜色?

您可以在运行时更改每个片段的 Activity Theme 属性。只要在片段被自定义样式膨胀之前覆盖它们,并应用到当前主题:

Value/styles.xml

    <style name="colorControlHighlight_blue">
<item name="colorControlHighlight">@color/main_blue_alpha26</item>
</style>

然后,在 onCreateView()膨胀前的片段中:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getContext().getTheme().applyStyle(R.style.colorControlHighlight_blue, true); //blue ripple color
View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
return view;
}

这种样式只适用于这个片段


不同视图的不同波纹颜色? (棒棒糖 +)

您可以分别使用 属性,如果你将它们直接应用到一个视图,它就是 没用:

    <TextView
...
colorControlHighlight="#40ffffff"/> <!-- DOESN'T WORK -->

你应该把它作为一个主题:

<TextView
...
android:theme="@style/colorControlHighlight_blue"/>

另外,有时这种方法有助于如果你有未知的问题与涟漪,你不能弄清楚它。 在我的例子中,我使用了第三方滑动库,它搅乱了整个布局的涟漪效应,并明确地将这个主题添加到所有可点击的视图中。

使用 foreground 属性作为 selectableItemBack 和背景属性作为所需的颜色。

android:foreground="?attr/selectableItemBackground"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:background="@color/white"

它在 API + 21上显示了色彩的涟漪效果,在 API -21上显示了简单的灰色背景。 添加这种风格:

<style name="AppTheme.MyRipple">
<item name="colorControlHighlight">@color/your_color</item>
<item name="android:background">?selectableItemBackgroundBorderless</item>
</style>

然后设置成视图:

<Button
...
android:theme="@style/AppTheme.MyRipple" />

这段代码让我产生了涟漪效应:

public static void setRippleDrawable(View view, int normalColor, int touchColor) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
RippleDrawable rippleDrawable = new RippleDrawable(ColorStateList.valueOf(touchColor), view.getBackground(), null);
view.setBackground(rippleDrawable);
} else {
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(touchColor));
stateListDrawable.addState(new int[]{android.R.attr.state_focused}, new ColorDrawable(touchColor));
stateListDrawable.addState(new int[]{}, new ColorDrawable(normalColor));
view.setBackground(stateListDrawable);
}
} catch (Exception e) {
Log.e(LOG_TAG, "" + e);
}
}

我没有找到任何方法来修改 selectableItemBack 属性。 这就是为什么我像上面那样做。

在黑暗的主题(或任何其他)应用程序尝试使用如下 首先在 drawable文件夹中创建 ripple_effect.xml并添加如下代码

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#f5f5f5">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<solid android:color="#f5f5f5" />


</shape>
</item>


</ripple>

然后设置背景为任意视图,如 Linear layout, Button, TextView等。

 <TextView
android:id="@+id/tvApply"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_effect"
android:clickable="true"
android:text="APPLY"
android:textColor="#FFFFFF"
android:gravity="center"
android:textSize="@dimen/_8sdp"
android:padding="@dimen/_8sdp"
android:focusable="true" />

使用以下步骤:

1. Make changes to button view in your layout.xml
2. Add new styles in styles.xml

Your _ lay.xml

<Button
android:id="@+id/setup_submit_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/action_sign_in"
android:textStyle="bold"
android:background="@color/colorPrimary"
android:textColor="@color/white"
style="@style/SelectableItemBackground"
android:foreground="?android:attr/selectableItemBackground"/>

- style 属性调用我们创建的样式。

- Foreground 属性调用 andorid 的默认可选属性。

Xml

 <style name="SelectableItemTheme">
<item name="colorControlHighlight">@color/white</item>
</style>




<style name="SelectableItemBackground">
<item name="android:theme">@style/SelectableItemTheme</item>
<item name="android:background">?attr/selectableItemBackground</item>
</style>