使用attr / selectableItemBackground作为背景时,如何修改波纹颜色?


103

我已经看到了一些SO问题,他们提供了一些可能的方法来实现我想要的。例如:

  1. colorControlHighlight在styles.xml中属性。

    这是我的styles-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到“ SelectableItemBackground”样式,或者更改为colorControlHighlight(no android: prefix)",或更改为?android:attr/selectableItemBackground,都没有用。

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

    所以我加android:backgroundTint="#5677FC"TextView。仍然没用。然后,我尝试将其更改android:backgroundTintModesrc_insrc_atop,但它们从未改变。

因此,当?attr/selectableItemBackground用作背景时,如何更改波纹颜色。我只关注棒棒糖及以上。先感谢您!

Answers:


154

最后,我找到了解决方案:我应该写另一种样式,而不是android:colorControlHighlight直接在theme 中使用SelectableItemBackground

<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>

最后添加style="@style/SelectableItemBackground"Viewlayout.xml中。

2016年8月26日更新 N发行后,我发现有时我们无法使用此方法为某种View(例如CardView)设置波纹颜色。现在,我强烈建议开发人员使用RippleDrawable,也可以在xml中声明。这是一个例子:

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

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

selectable_item_backgrounddrawable文件夹中:

<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>

selectable_item_backgrounddrawable-v21文件夹中:

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

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

<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或像那些对他们来说,否则输出纹波不会显示。


14
使用colorControlHighlight代替android:colorControlHighlight对我更好,否则仅适用于v21 +
Liuting

1
这不是正确的答案,请参阅下面的@harrane答案。
津(Jin)

2
如果您尚未设置ClickListener,则只需使视图可单击clickable="true",涟漪效果便会起作用
hedisam,

58

对Pre和Lollipop +设备的纹波影响

哈兰和流亭是对的。公认的答案不是最好的方法。让我在代码中展示如何更改Lollipop之前版本和更高版本的波纹颜色

  1. 您的AppTheme应该继承任何AppCompat主题,并包含colorControlHighlight属性(不带“ android:”前缀)

    <!-- Application theme. -->
    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="colorControlHighlight">#40ffffff</item>
    </style>
  2. 您的视图应包含clickable =“ true”(或应以编程方式设置点击侦听器),背景应为“?attr / selectableItemBackgroundBorderless”或“?attr / selectableItemBackground”:

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

注意:如果您的父视图具有白色背景,因为它是白色,所以不会看到波纹效果。将colorControlHighlight值更改为其他颜色

另外,如果您想在不同的活动上使用不同的波纹颜色,则可以在清单文件中为每个活动设置个人主题,例如:

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

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

您可以在运行时为每个片段更改活动主题的属性。只需在您的自定义样式夸大片段之前覆盖它们,然后将其应用于当前主题:

values / 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;
    }

此样式仅适用于此片段


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

您可以使用colorControlHighlight属性分别更改每个视图的波纹颜色,如果直接将它们应用到视图,则无法使用 :

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

您应该将其用作主题:

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

PS此外,有时候,如果您有未知的波纹问题并且无法弄清楚,这种方法会有所帮助。就我而言,我使用了第三方滑动库,它弄乱了整个布局的涟漪效果,并在为我设计的所有可点击视图中明确添加了此主题。


10

在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" />

3
重要的是要注意,它的确是您所写的,android:theme而不是人们通常使用的语言style
Android开发人员


5

使用以下步骤:

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

your_layout.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的默认selectable属性。

styles.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>

0

这段代码对我有用,引起了涟漪:

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);
    }
}

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


0

在深黑色主题(或任何其他)应用中,尝试使用如下所示的方法,首先ripple_effect.xmldrawable文件夹中创建并添加如下代码

<?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

将前景属性用作selectableItemBackground,将背景属性用作所需的颜色。

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

1
这样,您将无法更改波纹效果的颜色。现在的问题-How can I modify ripple color when using ?attr/selectableItemBackground as background?
HB。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.