Як я можу змінити колір пульсацій при використанні? Attr / selectableItemBackground як фон?


103

Я бачив декілька запитань ТА, і вони дали деякі можливі методи для досягнення того, чого я хочу. Наприклад:

  1. Використовуйте colorControlHighlightатрибут у styles.xml.

    Ось мої стилі-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_inта src_atop, і вони ніколи не змінили значення.

Отже, як я можу змінити колір пульсацій, коли я використовую ?attr/selectableItemBackgroundяк фон. Я зосереджуюсь лише на Lollipop і вище. Заздалегідь спасибі!

Відповіді:


154

Нарешті я знаходжу рішення: замість того, щоб 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>

Нарешті додати style="@style/SelectableItemBackground"доView в layout.xml.

ОНОВЛЕНО 2016/8/26 Після виходу N, я виявив, що іноді ми не можемо використовувати цей метод для встановлення кольору брижі для якогось типу View(наприклад, the CardView). Зараз настійно рекомендую розробникам використовуватиRippleDrawable , які також можна задекларувати у xml. Ось приклад:

Я хочу показати ефект пульсації, коли користувач торкається / клацає CardViewвище API21, і, звичайно, перед Lollipop повинен бути інший відгук. Тому я повинен написати:

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

і 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". Не забудьте встановити OnClickListener, OnTouchListenerчи що - щось на зразок тих , для них, в іншому випадку пульсація буде показувати.


14
Використовуйте colorControlHighlightзамість android:colorControlHighlightробіт краще для мене, в іншому випадку це тільки для v21 +
Liuting

1
Це не правильна відповідь, дивіться відповідь @ harrane нижче.
Цзінь

2
У випадку, якщо ви не встановили ClickListener, просто зробіть подання переглядачем clickable="true"і ефект пульсацій спрацює
hedisam

58

Ефект Ripple на пристроях до та 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. Ваш погляд повинен містити clickkable = "true" (або повинен мати програмно встановлений слухач кліків), а фон повинен бути "? Attr / selectableItemBackgroundBorderless" або "? Attr / selectableItemBackground":

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

Зауважте: якщо у вашого батьківського перегляду є білий фон, ви не побачите ефект пульсації, оскільки він білий. Змінення кольоруControlHighlight для іншого кольору

Крім того, якщо ви хочете різних кольорів пульсацій для різних видів діяльності, ви можете встановити особисту тему для кожної діяльності у файлі Manifest, наприклад:

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

Різні кольори пульсацій для різних фрагментів в одній діяльності?

Ви можете змінити атрибути Теми активності для кожного фрагмента під час виконання. Просто перезапишіть їх, перш ніж фрагмент буде завищений вашим власним стилем і застосувати до поточної теми:

у значеннях / 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.
андроїд розробник

6

Прийнята відповідь неправильна.

Правильний спосіб використання - це те, що згадується у коментарі Лейтінг. Використовуйте colorControlHighlightзамість того, android:colorControlHighlightщоб змінити типовий colorControlHighlightзAppCompat

* Будь ласка, зверніться до http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html у розділі Тема *


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

-Атрибут стилю називає стиль, який ми створили.

АтрибутForeground викликає атрибут, що вибирається за замовчуванням andorid.

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

-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?
НВ.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.