Подтвердить что ты не робот

Как изменить цвет пульсации при использовании? Attr/selectableItemBackground в качестве фона?

Я видел некоторые ВОПРОСЫ, и они дали некоторые возможные способы достижения того, чего я хочу. Например:

  • Используйте атрибут 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, и это не полезно.

  • Используйте атрибут backgroundTint в макете.

    Поэтому я добавляю android:backgroundTint="#5677FC" к моему TextView. Все еще бесполезно. Затем я попытался изменить android:backgroundTintMode на src_in и src_atop, и они никогда не изменяют.

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

4b9b3361

Ответ 1

Наконец, я нахожу решение: вместо использования 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 (например, 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 in v21 folder-->

Что это. Для других видов, возможно, вам следует использовать android:background="@drawable/selectable_item_background". Не забудьте установить OnClickListener, OnTouchListener или что-то вроде этого для них, иначе рябь не покажется.

Ответ 2

Волновой эффект на устройствах pre- и Lollipop+

Харран и Лютинг правы. Принятый ответ - не лучший способ. Позвольте мне показать в коде, как изменить цвет пульсации для версий pre- 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 Кроме того, иногда этот подход помогает, если у вас есть неизвестные проблемы с пульсацией, и вы не можете понять это. В моем случае я использовал стороннюю скользящую библиотеку, которая испортила волновые эффекты для всего макета и явно добавила эту тему ко всем интерактивным представлениям, разработанным для меня.

Ответ 3

Принятый ответ неверен.

Правильный способ использования - это то, что Liuting упомянул в комментарии. Используйте colorControlHighlight вместо android:colorControlHighlight для изменения значения по умолчанию colorControlHighlight из AppCompat

* Пожалуйста, обратитесь к http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html в разделе Темы *

Ответ 4

Это показывает волновой эффект с цветом на 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" />

Ответ 5

Используйте атрибут переднего плана в качестве selectableItemBackground и атрибут фона в качестве нужного цвета.

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

Ответ 6

Этот код работает для меня, чтобы создать пульсацию:

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. Вот почему я сделал это, как указано выше.

Ответ 7

В тёмно-чёрной теме (или любом другом) приложение попробуйте использовать как ниже сначала создайте 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" />

Ответ 8

Используйте следующие шаги:

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 -The вызывает стиль, который мы создали.

Атрибут -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>