Как я могу изменить цвет пульсации при использовании?attr / selectableItemBackground в качестве фона?
Я видел некоторые так Вопросы, и они дали некоторые возможные методы для достижения того, что я хочу. Например:
-
использовать в стилях.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
, ни один из них полезный. -
использовать в макете.
поэтому я добавляю
android:backgroundTint="#5677FC"
мойTextView
. Все равно бесполезно. Затем я попытался изменитьandroid:backgroundTintMode
доsrc_in
иsrc_atop
, и они никогда не делают разницы.
Итак, как я могу изменить цвет пульсации, когда я использую ?attr/selectableItemBackground
в качестве фона. Я сосредотачиваюсь только на леденце и выше. Заранее спасибо!
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 версии и выше
ваш AppTheme должен наследовать от любой темы AppCompat и содержать атрибут colorControlHighlight (без префикса " android:")
<!-- Application theme. --> <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="colorControlHighlight">#40ffffff</item> </style>
ваше представление должно содержать 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 В разделе тематизации *