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


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

  1. использовать в стилях.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. использовать в макете.

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

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

4 62

4 ответа:

наконец-то я нашел решение: вместо использования 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 в макете.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_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>

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 или что-то подобное для них, иначе рябь не будет отображаться.

Харран и Лютин правы. Принятый ответ-не лучший способ. Позвольте мне показать в коде, как изменить цвет пульсации для 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"
        />

UPD: Что делать, если вы хотите различные цвета пульсации для разные фрагменты в одной и той же деятельности?

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

на ценностей/стили.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;
    }

этот стиль будет работать только для Этот фрагмент

UPD 2: Пожалуйста поправьте меня, если я ошибаюсь, но кажется, что атрибут colorControlHighlight не работает в макетах если вы примените их к виду:

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

и работает только тогда, когда он установлен на тему

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

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

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

используйте атрибут переднего плана как selectableItemBackground и атрибут фона, как цвет, который вы хотите.

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