android — Как я могу изменить цвет ряби при использовании? Attr /selectableItemBackground в качестве фона?" />

Как я могу изменить цвет ряби при использовании? 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 и выше. Заранее спасибо!

67 голосов | спросил ywwynm 11 +03002015-10-11T05:48:13+03:00312015bEurope/MoscowSun, 11 Oct 2015 05:48:13 +0300 2015, 05:48:13

4 ответа


0

Наконец, я нахожу решение: вместо использования 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/26/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 или что-то подобное для них, иначе рябь не будет отображаться.

ответил ywwynm 12 +03002015-10-12T18:39:41+03:00312015bEurope/MoscowMon, 12 Oct 2015 18:39:41 +0300 2015, 18:39:41
0

Эффект ряби на устройствах до и 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"/>

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

ответил Kirill Karmazin 22 J000000Friday16 2016, 21:57:28
0

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

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

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

ответил harrane 28 Maypm16 2016, 16:12:13
0

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

android:foreground="?attr/selectableItemBackground"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:background="@color/white"
ответил Titto Jose 5 +03002018-10-05T14:18:55+03:00312018bEurope/MoscowFri, 05 Oct 2018 14:18:55 +0300 2018, 14:18:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132