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

时间:2015-10-11 02:48:14

标签: android android-layout android-5.0-lollipop material-design android-appcompat

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

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

    这是我的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:backgroundTintMode更改为src_insrc_atop,但他们从未有所作为。

  3. 那么,当我使用?attr/selectableItemBackground作为背景时,如何更改波纹颜色。我只关注棒棒糖及以上。提前谢谢!

8 个答案:

答案 0 :(得分:110)

最后我找到了解决方案:我不应该直接在主题android:colorControlHighlight中使用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>

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

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

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

<android.support.v7.widget.CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:foreground="@drawable/selectable_item_background"/>
{p}和selectable_item_background文件夹中的drawable

<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_background 文件夹中的

drawable-v21

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

最后,ripple_black(或drawable)文件夹中的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或类似的东西,否则涟漪不会显示。

答案 1 :(得分:49)

前置和棒棒糖+设备的纹波效应

哈拉伦和流亭是正确的。接受的答案不是最好的方法。 让我在代码中展示如何更改 pre-Lollipop 版本及更高版本的纹波颜色

  1. 您的AppTheme应该继承任何AppCompat主题并包含colorControlHighlight属性(没有&#39; android:&#39;前缀)

    <!-- Application theme. -->
    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="colorControlHighlight">#40ffffff</item>
    </style>
    
  2. 您的观点应包含可点击的=&#34; true&#34; (或者应该以编程方式设置点击监听器),背景应该是&#34;?attr / selectableItemBackgroundBorderless&#34;或&#34;?attr / selectableItemBackground&#34; :

    <LinearLayout
    ...
    android:clickable="true"
    android:background="?attr/selectableItemBackgroundBorderless"/>
    
  3. 注意:如果您的父视图具有白色背景,则您不会看到涟漪效应,因为它是白色的。更改另一种颜色的colorControlHighlight值

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

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

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

    您可以在运行时更改每个片段的Activity Theme的属性。只需在使用自定义样式对片段进行充气之前覆盖它们并应用于当前主题:

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

    P.S。此外,有时这种方法有助于你有未知的涟漪问题,你无法弄明白。 在我的例子中,我使用了第三方滑动库,它为整个布局搞砸了涟漪效果,并明确地将这个主题添加到为我制作的所有可点击视图中。

答案 2 :(得分:5)

接受的答案是错误的。

正确的使用方法是Liuting在评论中提到的。 使用colorControlHighlight代替android:colorControlHighlight更改colorControlHighlight的默认AppCompat

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

使用前台属性作为selectableItemBackground 和背景属性作为您想要的颜色。

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

答案 5 :(得分: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属性的方法。 这就是为什么我像上面那样做。

答案 6 :(得分:0)

在深黑色主题(或任何其他)应用中尝试按以下方式使用 首先在ripple_effect.xml文件夹中创建drawable并添加类似的代码

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

答案 7 :(得分:0)

使用以下步骤:

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>