it-swarm.com.ru

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

Я видел несколько 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:backgroundTintMode на src_in и src_atop, и они никогда не имели значения.

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

70
ywwynm

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

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

103
ywwynm

Пульсация на устройствах 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"/>

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

44
Kirill Karmazin

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

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

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

5
harrane

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

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

Android:foreground="?attr/selectableItemBackground"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    Android:background="@color/white"
0
Titto Jose